2012-10-19 18 views
9

मेरा प्रश्न: मैं संसाधन छवि की चमक को बदलने में सक्षम होना चाहता हूं और इसके तीन उदाहरण ImageIcons के रूप में बदलना चाहते हैं। एक 50% चमक (इतना गहरा) पर, दूसरा 75% चमक (थोड़ा हल्का), और अंत में 100% चमक (मूल छवि के समान) पर। मैं पारदर्शिता को भी संरक्षित करना चाहता हूं।किसी छवि की चमक को कैसे बदलें

मैंने जो कोशिश की है: मैंने चारों ओर खोज की है और ऐसा लगता है कि RescaleOp का उपयोग करने का सबसे अच्छा समाधान है, लेकिन मैं इसे समझ नहीं सकता। मुझे नहीं पता कि स्केल फैक्टर और ऑफ़सेट क्या है। मैंने जो कोशिश की है उसके लिए मेरा कोड यहां दिया गया है।

seeATemplateButton.initialize("/resources/templateIcon-regular.png", 100f, 75f, 50f, "See A Template"); 
//I think my 100f, 75f, 50f variables need to change, but whenever I change them it behaves unexpectedly (changes colors and stuff). 

क्या है कि कोड के साथ होता है: छवि दिखाई देती है "अदृश्य" मैं जानता हूँ कि यह नहीं है, क्योंकि यह एक माउस क्लिक किया घटना के साथ एक JLabel पर है

public void initialize(String imageLocation, float regularBrightness, float focusedBrightness, float pressedBrightness, String borderTitle) throws IOException { 
    BufferedImage bufferedImage = ImageIO.read(ButtonIcon.class.getResource(imageLocation)); 
    setRegularIcon(getAlteredImageIcon(bufferedImage, regularBrightness)); 
    setFocusedIcon(getAlteredImageIcon(bufferedImage, focusedBrightness)); 
    setPressedIcon(getAlteredImageIcon(bufferedImage, pressedBrightness)); 
    setTitle(borderTitle); 
    init(); 
} 

private ImageIcon getAlteredImageIcon(BufferedImage bufferedImage, float brightness) { 
    RescaleOp rescaleOp = new RescaleOp(brightness, 0, null); 
    return new ImageIcon(rescaleOp.filter(bufferedImage, null)); 
} 

कॉल कुछ इस तरह होगा उस पर और यह ठीक काम करता है। अगर मैं सिर्फ चमक बदलते हिस्से को छोड़ देता हूं और setRegularIcon(new ImageIcon(Button.class.getResource(imageLocation)); कहता हूं तो यह ठीक काम करता है, लेकिन जाहिर है कि यह कोई गहरा नहीं है।

मैं क्या लगता है कि मैं की जरूरत है: कुछ बारे में समझने के मतलब क्या offset, scaleFactor, और filter विधि/करते हैं, और फलस्वरूप क्या संख्या चमक चर के लिए देने के लिए।

किसी भी मदद की सराहना की जाएगी! धन्यवाद!

+1

इस समान प्रश्न देखने के लिए फिर से सेट है। कॉम/प्रश्न/3433275/एडजस्ट-ब्राइटनेस-एंड-कंट्रास्ट-ऑफ-बफर्डिमेज-इन-जावा –

उत्तर

5

दस्तावेज़ कहते हैं: इस प्रकार

rescaling ऑपरेशन के लिए छद्म कोड है:

for each pixel from Source object { 
    for each band/component of the pixel { 
     dstElement = (srcElement*scaleFactor) + offset 
    } 
} 

यह सिर्फ हर पिक्सेल पर एक रेखीय परिवर्तन है। उस परिवर्तन के पैरामीटर scaleFactor और offset हैं। यदि आप 100% चमक चाहते हैं, तो यह परिवर्तन एक पहचान होना चाहिए, यानी dstElement = srcElementscaleFactor = 1 और offset = 0 सेट करना चाल है।

अब मान लीजिए कि आप छवि को 75% चमकते हुए छवि को गहरा बनाना चाहते हैं। यह पिक्सेल मानों को 0.75 तक गुणा करने की मात्रा है। आप चाहते हैं: dstElement = 0.75 * srcElement। तो स्केल फैक्टर = 0.75 और offset = 0 को चाल चलाना चाहिए। आपके मूल्यों की समस्या यह है कि वे 0 से 100 तक जाते हैं, आपको 0 और 1.

+0

स्पष्टीकरण के लिए धन्यवाद। दुर्भाग्यवश जब मैं अपनी चमक को 1.0f और मेरी ऑफ़सेट 0 पर बदलता हूं, तो यह अभी भी अदृश्य है। अगर मैं 'फ़िल्टर' (bufferedImage, bufferedImage) 'फ़िल्टर (bufferedImage, null) 'के बजाय' फ़िल्टर 'बफर को बदलता हूं, तो यह एक मजेदार नीला रंग है। कोई उपाय? – kentcdodds

+0

क्या ये आरजीबी या ग्रेस्केल छवियां हैं? यह प्रासंगिक है। [यह लिंक] जांचें (http://www.exampledepot.com/egs/java.awt.image/Bright.html) –

+0

ये आरजीबी छवियां हैं। – kentcdodds

4

के बीच मानों का उपयोग करने की आवश्यकता है, मैं केवल अर्ध-पारदर्शी काला के साथ छवि पर लिखने का सुझाव दूंगा। paintComponent विधि में,

Graphics g = img.getGraphics(); 
float percentage = .5f; // 50% bright - change this (or set dynamically) as you feel fit 
int brightness = (int)(256 - 256 * percentage); 
g.setColor(new Color(0,0,0,brightness)); 
g.fillRect(0, 0, img.getWidth(), img.getHeight()); 

या यदि आपने अभी प्रदर्शन उद्देश्यों के लिए चित्र का उपयोग कर रहे हैं यह:

मान लिया जाये कि आप छवि पर सीधे लिखना चाहते हैं। यहाँ एक SSCCE है:

import java.awt.*; 
import java.awt.image.*; 
import java.io.IOException; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 


public class ImageBrightener extends JPanel{ 

    BufferedImage img; 
    float percentage = 0.5f; 

    public Dimension getPreferredSize(){ 
     return new Dimension(img.getWidth(), img.getHeight()); 
    } 

    public ImageBrightener(){ 
     try { 
      img = ImageIO.read(new URL("http://media.giantbomb.com/uploads/0/1176/230441-thehoff_super.jpeg")); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.drawImage(img, 0, 0, this); 
     int brightness = (int)(256 - 256 * percentage); 
     g.setColor(new Color(0,0,0,brightness)); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
    } 

    public static void main(String[] args){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new ImageBrightener()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

संपादित

उपर दिए गए कोड मान लिया जाये, तो आप रास्टेराइज़र साथ खिलवाड़ से अल्फा के अलावा सब कुछ में हेरफेर कर सकते हैं।इस उदाहरण का उपयोग करते हुए यहां एक उदाहरण दिया गया है (के बजाय shadedImage पेंट करें)। इसका ध्यान रखें बढ़त मामलों को पकड़ने नहीं करता आरजीबी से अधिक 256 और कम से कम 0.

 img = ImageIO.read(new URL("http://media.giantbomb.com/uploads/0/1176/230441-thehoff_super.jpeg")); 
     shadedImage = new BufferedImage(img.getWidth(), img.getWidth(), BufferedImage.TYPE_INT_ARGB); 
     shadedImage.getGraphics().drawImage(img, 0, 0, this); 

     WritableRaster wr = shadedImage.getRaster(); 
     int[] pixel = new int[4]; 

     for(int i = 0; i < wr.getWidth(); i++){ 
      for(int j = 0; j < wr.getHeight(); j++){ 
       wr.getPixel(i, j, pixel); 
       pixel[0] = (int) (pixel[0] * percentage); 
       pixel[1] = (int) (pixel[1] * percentage); 
       pixel[2] = (int) (pixel[2] * percentage); 
       wr.setPixel(i, j, pixel); 
      } 
     } 
+0

यदि छवि पारदर्शिता थी तो क्या यह पृष्ठभूमि को प्रभावित करेगा? मुझे लगता है कि यह होगा। है ना? – kentcdodds

+0

@kentcdodds Touche - मैं इस धारणा के तहत था कि जब आपने कहा "मैं भी पारदर्शिता को संरक्षित करना चाहता हूं।" आपका मतलब था कि यह अभी भी पारदर्शी (लेकिन गहरा) होना चाहिए। तो अगर यह सिर्फ पारदर्शी होना चाहिए, तो यह अलग है। –

+0

हाँ, लेकिन आपके एसएससीसीई ने बहुत अच्छा काम किया और मुझे यह समझने में मदद की कि क्या हो रहा था। इच्छा है कि यह मेरे उपयोग के मामले के लिए काम करेगा! – kentcdodds

1

अध्ययन के लिए कुछ और उदाहरण को महत्व देता है: एक छवि के

  • AlphaTest rescales सिर्फ अल्फा पारदर्शिता बिना किसी ऑफसेट के शून्य और एक के बीच। संयोग से, यह छवि को तीन-चौथाई आकार में भी दोहराता है।

  • RescaleOpTest एक निश्चित पैमाने और कोई ऑफ़सेट का उपयोग करके ऐसा ही करता है।

  • RescaleTest स्केल सभी बिना किसी ऑफसेट के शून्य और दो के बीच एक छवि के बैंड।

API, पैमाने में बताया गया है और ऑफसेट रैखिक कार्य की क्रमश: ढलान और y संवाद, के रूप में प्रत्येक बैंड के लिए लागू कर रहे हैं, के रूप में। http: // stackoverflow

dstElement = (srcElement*scaleFactor) + offset 
0

बुनियादी तर्क, प्रत्येक पिक्सेल का आरजीबी मान ले इसे करने के लिए कुछ कारक जोड़ने के लिए, resulltant मैट्रिक्स (बफर छवि)

import java.io.*; 
    import java.awt.Color; 
    import javax.imageio.ImageIO; 
    import java.io.*; 
    import java.awt.image.BufferedImage; 



     class psp{ 

    public static void main(String a[]){ 
    try{ 

    File input=new File("input.jpg"); 
    File output=new File("output1.jpg"); 
      BufferedImage picture1 = ImageIO.read(input); // original 
    BufferedImage picture2= new BufferedImage(picture1.getWidth(), picture1.getHeight(),BufferedImage.TYPE_INT_RGB);  
      int width = picture1.getWidth(); 
      int height = picture1.getHeight(); 

    int factor=50;//chose it according to your need(keep it less than 100) 
    for (int y = 0; y < height ; y++) {//loops for image matrix 
    for (int x = 0; x < width ; x++) { 

    Color c=new Color(picture1.getRGB(x,y)); 

    //adding factor to rgb values 
int r=c.getRed()+factor; 
    int b=c.getBlue()+factor; 
    int g=c.getGreen()+factor; 
    if (r >= 256) { 
    r = 255; 
    } else if (r < 0) { 
    r = 0; 
    } 

    if (g >= 256) { 
    g = 255; 
    } else if (g < 0) { 
    g = 0; 
    } 

    if (b >= 256) { 
    b = 255; 
    } else if (b < 0) { 
    b = 0; 
    } 
    picture2.setRGB(x, y,new Color(r,g,b).getRGB()); 


    } 
    } 
    ImageIO.write(picture2,"jpg",output);  
    }catch(Exception e){ 
    System.out.println(e); 
    } 
    }} 
संबंधित मुद्दे