如何控制图像的亮度?

用户8491933

我有以下问题:

我想创建一种方法来控制图像的亮度。我想我之前必须将它转换为 BufferedImage 。
如果图像有一个 alpha 通道,我想用TYPE_INT_RGBalpha 像素将其转换为黑色。但它可以正常工作TYPE_INT_ARGB......
如果图像没有 alpha 通道并且我将它转换为TYPE_INT_ARGB. 那么不仅亮度会发生变化,颜色也会发生变化。当我使图像更亮时,它会变得更黄,如果我变暗,它会变成蓝色。
我可以用另一种方式转换它还是有可能检查图像是否有 alpha 通道?

这是我的代码:

public static Image brightnessControl(Image image, float brightness) {

    //First I convert the Image to a BufferedImage
    BufferedImage bi = new BufferedImage
            (image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    Graphics bg = bi.getGraphics();
    bg.drawImage(image, 0, 0, null);
    bg.dispose();

    //here I brighten/darken the BufferedImage
    RescaleOp rescaleOp = new RescaleOp(brightness, 0, null);
    rescaleOp.filter(bi, bi);

    //I change the BufferedImage back to the Image again!
    image = bi;

    //Last but not least I return the Image...
    return image;
}
大卫布扎托

看看下面的代码。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

    public static void main( String[] args ) throws IOException {

        Image img = ImageIO.read( new File( "image.jpeg" ) );

        new JFrame(){
            {
                setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                setSize( 800, 600 );
                setLocationRelativeTo( null );
                add( new JPanel(){
                    @Override
                    protected void paintComponent( Graphics g ) {

                        super.paintComponent( g );

                        int imgWidth = img.getWidth( null );
                        int imgHeight = img.getHeight( null );
                        int lines = 4;
                        int columns = 6;
                        int count = 1;

                        for ( int i = 0; i < lines; i++ ) {
                            for ( int j = 0; j < columns; j++ ) {
                                g.drawImage( newBrightness( img, 1f/(lines*columns)*count ), imgWidth * j, imgHeight * i, null );
                                count++;
                            }
                        }
                    }
                });
            }
        }.setVisible( true );

    }

    public static Image newBrightness( Image source, float brightnessPercentage ) {

        BufferedImage bi = new BufferedImage( 
                source.getWidth( null ), 
                source.getHeight( null ), 
                BufferedImage.TYPE_INT_ARGB );

        int[] pixel = { 0, 0, 0, 0 };
        float[] hsbvals = { 0, 0, 0 };

        bi.getGraphics().drawImage( source, 0, 0, null );

        // recalculare every pixel, changing the brightness
        for ( int i = 0; i < bi.getHeight(); i++ ) {
            for ( int j = 0; j < bi.getWidth(); j++ ) {

                // get the pixel data
                bi.getRaster().getPixel( j, i, pixel );

                // converts its data to hsb to change brightness
                Color.RGBtoHSB( pixel[0], pixel[1], pixel[2], hsbvals );

                // create a new color with the changed brightness
                Color c = new Color( Color.HSBtoRGB( hsbvals[0], hsbvals[1], hsbvals[2] * brightnessPercentage ) );

                // set the new pixel
                bi.getRaster().setPixel( j, i, new int[]{ c.getRed(), c.getGreen(), c.getBlue(), pixel[3] } );

            }

        }

        return bi;

    }

}

它将读取图像并使用具有新亮度的新图像创建矩阵。这是我的个人资料图片的结果。

在此处输入图片说明

编辑:

现在它也支持 alpha。之前的代码中,新像素的alpha分量固定为255,我改成使用原像素的alpha分量(pixel[3])。

在此处输入图片说明

编辑2:

每个像素都有一个从 0 到 1 变化的亮度分量。如果这个分量外推值 1,像素将具有“奇怪”的颜色。您想要一些看起来比原来更亮的东西,因此,您需要验证新的亮度值是否推断为 1。上面的示例将执行此操作。您将有一个滑块来控制将计算到新像素亮度分量的最大百分比。如果此值超过最大值 (1),则将使用最大值。我希望现在它终于可以帮助您:D

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ChangeImageBrightnessExample2 {

    public static void main( String[] args ) throws IOException {
        new ChangeImageBrightnessExample2().createUI();
    }

    public void createUI() throws IOException {

        Image img = ImageIO.read( new File( "image.jpeg" ) );

        new JFrame(){
            {
                setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                setSize( 800, 600 );
                setLocationRelativeTo( null );

                CustomPanel panel = new CustomPanel();
                panel.setImage( img );

                JSlider slider = new JSlider( 0, 400, 100 );
                slider.setMinorTickSpacing( 10);
                slider.setMajorTickSpacing( 50 );
                slider.setPaintLabels( true );
                slider.setPaintTicks( true );
                slider.setSnapToTicks( true );
                slider.addChangeListener( new ChangeListener() {
                    @Override
                    public void stateChanged( ChangeEvent evt ) {
                        JSlider s = ((JSlider) evt.getSource());
                        if ( s.getValueIsAdjusting() ) {
                            panel.setMaximumBrightnessPercentage( s.getValue()/100f );
                            panel.repaint();
                        }

                    }
                });

                add( panel, BorderLayout.CENTER );
                add( slider, BorderLayout.SOUTH );

            }
        }.setVisible( true );

    }

    public static Image newBrightness( Image source, float brightnessPercentage ) {

        BufferedImage bi = new BufferedImage( 
                source.getWidth( null ), 
                source.getHeight( null ), 
                BufferedImage.TYPE_INT_ARGB );

        int[] pixel = { 0, 0, 0, 0 };
        float[] hsbvals = { 0, 0, 0 };

        bi.getGraphics().drawImage( source, 0, 0, null );

        // recalculare every pixel, changing the brightness
        for ( int i = 0; i < bi.getHeight(); i++ ) {
            for ( int j = 0; j < bi.getWidth(); j++ ) {

                // get the pixel data
                bi.getRaster().getPixel( j, i, pixel );

                // converts its data to hsb to change brightness
                Color.RGBtoHSB( pixel[0], pixel[1], pixel[2], hsbvals );

                // calculates the brightness component.
                float newBrightness = hsbvals[2] * brightnessPercentage;
                if ( newBrightness > 1f ) {
                    newBrightness = 1f;
                }

                // create a new color with the new brightness
                Color c = new Color( Color.HSBtoRGB( hsbvals[0], hsbvals[1], newBrightness ) );

                // set the new pixel
                bi.getRaster().setPixel( j, i, new int[]{ c.getRed(), c.getGreen(), c.getBlue(), pixel[3] } );

            }

        }

        return bi;

    }

    private class CustomPanel extends JPanel {

        private float maximumBrightnessPercentage = 1f;
        private Image image;

        @Override
        protected void paintComponent( Graphics g ) {

            super.paintComponent( g );

            int imgWidth = image.getWidth( null );
            int imgHeight = image.getHeight( null );
            int lines = 4;
            int columns = 6;
            int count = 1;

            for ( int i = 0; i < lines; i++ ) {
                for ( int j = 0; j < columns; j++ ) {
                    float newBrightness = maximumBrightnessPercentage/(lines*columns)*count;
                    g.drawImage( newBrightness( image, newBrightness ), imgWidth * j, imgHeight * i, null );
                    g.drawString( String.format( "%.2f%%", newBrightness*100 ), imgWidth * j, imgHeight * i + 10 );
                    count++;
                }
            }

        }

        public void setMaximumBrightnessPercentage( float maximumBrightnessPercentage ) {
            this.maximumBrightnessPercentage = maximumBrightnessPercentage;
        }

        public void setImage( Image image ) {
            this.image = image;
        }

    }

}

看看下面的图片。

在此处输入图片说明

我想现在你会明白的。如果没有,我会放弃:D

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用numericupdown控制图像的亮度

来自分类Dev

如何在NSTextView中控制图像附件的大小

来自分类Dev

如何在CSS psuedo元素之前/之后控制图像

来自分类Dev

如何在NSTextView中控制图像附件的大小

来自分类Dev

如何使用数组/位图控制图像的大小?

来自分类Dev

如何获得图像的亮度梯度

来自分类Dev

如何控制图片的大小

来自分类Dev

使用滑块控制图像大小

来自分类Dev

如何在MailChimp RSS广告系列中控制图像的宽度

来自分类Dev

如何在iOS 7上更改重新排序控制图像

来自分类Dev

如何在tkinter按钮小部件上控制图像和文本之间的空间?

来自分类Dev

如何通过外部样式表而不是使用属性来控制图像的宽度/高度?

来自分类Dev

如何控制图像高度以匹配 html 电子邮件中的相邻文本

来自分类Dev

如何在后端 asp.net mvc 中控制图像的大小

来自分类Dev

Windows:如何控制自适应亮度?

来自分类Dev

图像处理:如何获得亮度权重值?

来自分类Dev

如何从终端控制图形程序?

来自分类Dev

如何控制图形显示的时间?

来自分类Dev

如何使用TextureBrush绘制图像

来自分类Dev

如何强制图像缩小以适合Flexbox?

来自分类Dev

如何使用KineticJS限制图像拖动?

来自分类Dev

Matlab。如何绘制图像

来自分类Dev

如何使用GCD绘制图像?

来自分类Dev

使用媒体查询来控制图像下载

来自分类Dev

VBA控制图像的透明度可能吗?

来自分类Dev

Javascript Canvas如何绘制图像很多图像

来自分类Dev

如何在Lenovo Yoga 13上使用亮度控制?

来自分类Dev

如何在Lenovo Yoga 13上使用亮度控制?

来自分类Dev

如何在Ubuntu 14.04系统上控制亮度?

Related 相关文章

热门标签

归档