How to change the brightness of an Image

前端 未结 4 506
没有蜡笔的小新
没有蜡笔的小新 2021-02-06 01:42

My Question: I want to be able to change the brightness of a resource image and have three instances of it as ImageIcons. One at 50% brightness (so darker), ano

相关标签:
4条回答
  • 2021-02-06 01:56

    The doc says:

    The pseudo code for the rescaling operation is as follows:

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

    It's just a linear transformation on every pixel. The parameters for that transformation are scaleFactor and offset. If you want 100% brightness, this transform must be an identity, i.e. dstElement = srcElement. Setting scaleFactor = 1 and offset = 0 does the trick.

    Now suppose you want to make the image darker, at 75% brightness like you say. That amounts to multiplying the pixel values by 0.75. You want: dstElement = 0.75 * srcElement. So setting scaleFactor = 0.75 and offset = 0 should do the trick. The problem with your values is that they go from 0 to 100, you need to use values between 0 and 1.

    0 讨论(0)
  • 2021-02-06 01:57

    I would suggest just writing over the image with a semi-transparent black.

    Assuming you want to write directly on the image:

    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());
    

    Or if you're just using the image for display purposes, do it in the paintComponent method. Here's an 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);
        }
    }
    

    EDIT

    Assuming the same code as above, you can manipulate everything besides the Alpha by messing with the rasterizer. Here's an example (paint shadedImage instead of img if using this exmaple). Please note this doesn't catch edge cases of RGB values greater than 256 and less than 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 讨论(0)
  • 2021-02-06 02:10

    A few more examples for study:

    • AlphaTest rescales just the alpha transparency of an image between zero and one with no offsets. Coincidentally, it also resamples the image to three-quarter size.

    • RescaleOpTest does the same using a fixed scale and no offsets.

    • RescaleTest scales all bands of an image between zero and two with no offsets.

    As noted in the API, the scale and offset are applied to each band as the slope and y-intercept, respectively, of a linear function.

    dstElement = (srcElement*scaleFactor) + offset
    
    0 讨论(0)
  • 2021-02-06 02:10

    Basic logic is take RGB value of each pixel ,add some factor to it,set it again to resulltant matrix(Buffered Image)

        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);
        }
         }}
    
    0 讨论(0)
提交回复
热议问题