JAVA如何将颜色从一个bufferedImage复制到另一个

时间:2016-06-29 04:17:07

标签: java bufferedimage

我试图将BufferedImage中的颜色复制到另一个bufferedImage,下面是我的代码。 我知道我可以使用graphics.drawImage,但我需要更改某些颜色,这就是为什么我要逐个像素地复制颜色而不是仅仅将图像绘制在另一个BufferedImage上 虽然它没有用。 线" t.setRGB"似乎对BufferedImage" t"没有任何影响。 保存图像" t"后,我得到一张空白图片。 我做错了什么?

还有一个问题。如何修改" myColor"使用" alpha"的方法价值也是?

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;

public class imgSt{

    public static int rgb;

    public static int myColor( int r, int g, int b){
        rgb= (65536 * r) + (256 * g) + (b);
        return rgb;
    }

    public static void main( String args[] ){

        try {
            BufferedImage img = ImageIO.read(new File( "8.jpg"));

            BufferedImage t= new BufferedImage( img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB );

            int clear=0x000000FF;
            int color, alpha, r, g, b;

            for(int i=0; i<img.getWidth(); ++i){
                for( int j=0; j<img.getHeight(); ++j ){

                    color = img.getRGB(i,j);
                    alpha = (color>>24) & 0xff;
                    r = (color & 0x00ff0000) >> 16;
                    g = (color & 0x0000ff00) >> 8;
                    b = color & 0x000000ff; 

                    t.setRGB( i,j, myColor( r, g, b )  );
                } 
            } //for

            ImageIO.write( t, "jpg", new File(" sT.jpg") );

        } catch (IOException e){ e.printStackTrace(); }

    }//main
}//class

2 个答案:

答案 0 :(得分:1)

虽然使用其他答案中建议的光栅通常比使用getRGB()/setRGB()更快,但您的方法并没有根本错误。

问题是getRGB()/setRGB()方法适用于ARGB值,而不仅仅是RGB。因此,当您的myColor()方法离开alpha分量0时,这基本上意味着颜色将是100%透明的。这就是你得到一张空白图片的原因。您可能需要100%不透明像素。

这里是你的方法的固定版本(我通常认为它更难以坚持位移,因此转换到打包表示的方式是相似的),它会以打包的ARGB格式创建不透明的颜色:

public static int myColor(int r, int g, int b) {
    int argb = 0xFF << 24 | r << 16 | g << 8 | b;
    return argb;
}

为了便于阅读,我还更改了解包代码,虽然它并非绝对必要:

int color = img.getRGB(i,j);
int alpha = (color >>> 24) & 0xff;
int r = (color >> 16) & 0xff;
int g = (color >> 8) & 0xff ;
int b = color & 0xff;

答案 1 :(得分:0)

您可以使用栅格执行此操作:

BufferedImage imsrc = ... // The source image, RGBA
BufferedImage imres = ... // The resulting image, RGB or BGR
WritableRaster wrsrc = imsrc.getRaster() ;
WritableRaster wrres = imres.getRaster() ;
for (int y=0 ; y < image.getHeight() ; y++)
    for (int x=0 ; x < image.getWidth() ; x++)
        {
        wrres.setSample(x, y, 0, wrsrc.getSample(x, y, 0)) ;
        wrres.setSample(x, y, 1, wrsrc.getSample(x, y, 1)) ;
        wrres.setSample(x, y, 2, wrsrc.getSample(x, y, 2)) ;
        }

使用光栅时,您不必管理图像编码,频道按红绿蓝Alpha排序。所以我只是浏览整个图像,然后将RGB像素复制到结果中。