在java中为缓冲图像指定颜色

在java中为缓冲图像指定颜色,java,image,image-processing,bufferedimage,pixels,Java,Image,Image Processing,Bufferedimage,Pixels,我有一个像这样的缓冲图像 我怎么给它上色?我是java图像处理新手,如有任何帮助,将不胜感激。这是生成此图片的代码示例 public BufferedImage getDifferenceImage(BufferedImage img1, BufferedImage img2) { int width1 = img1.getWidth(); // Change - getWidth() and getHeight() for BufferedImage int width2

我有一个像这样的缓冲图像

我怎么给它上色?我是java图像处理新手,如有任何帮助,将不胜感激。这是生成此图片的代码示例

   public BufferedImage getDifferenceImage(BufferedImage img1, BufferedImage img2) {
    int width1 = img1.getWidth(); // Change - getWidth() and getHeight() for BufferedImage
    int width2 = img2.getWidth(); // take no arguments
    int height1 = img1.getHeight();
    int height2 = img2.getHeight();
    if ((width1 != width2) || (height1 != height2)) {
        System.err.println("Error: Images dimensions mismatch");
        System.exit(1);
    }

    // NEW - Create output Buffered image of type RGB
    BufferedImage outImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    // Modified
    long diff;
    int result; // Stores output pixel
    for (int i = 0; i < height1; i++) {
        for (int j = 0; j < width1; j++) {
            int rgb1 = img1.getRGB(j, i);
            int rgb2 = img2.getRGB(j, i);
            int r1 = (rgb1 >> 16) & 0xff;
            int g1 = (rgb1 >> 8) & 0xff;
            int b1 = (rgb1) & 0xff;
            int r2 = (rgb2 >> 16) & 0xff;
            int g2 = (rgb2 >> 8) & 0xff;
            int b2 = (rgb2) & 0xff;
            diff = Math.abs(r1 - r2); // Change
            diff += Math.abs(g1 - g2);
            diff += Math.abs(b1 - b2);
            diff /= 255; // Change - Ensure result is between 0 - 255
            // Make the difference image gray scale
            // The RGB components are all the same
            result = (diff << 16) | (diff << 8) | diff;
            outImg.setRGB(j, i, result); // Set result
        }
    }

    // Now return
    return outImg;
}
公共BuffereImage getDifferenceImage(BuffereImage img1、BuffereImage img2){
int width1=img1.getWidth();//更改buffereImage的-getWidth()和getHeight()
int width2=img2.getWidth();//不接受任何参数
int height1=img1.getHeight();
int height2=img2.getHeight();
如果((宽度1!=宽度2)| |(高度1!=高度2)){
System.err.println(“错误:图像尺寸不匹配”);
系统出口(1);
}
//新建-创建RGB类型的输出缓冲图像
BuffereImage outImg=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
//修改
长差;
int result;//存储输出像素
对于(int i=0;i>16)和0xff;
int g1=(rgb1>>8)和0xff;
int b1=(rgb1)&0xff;
int r2=(rgb2>>16)和0xff;
int g2=(rgb2>>8)和0xff;
int b2=(rgb2)&0xff;
diff=Math.abs(r1-r2);//更改
微分+=数学绝对值(g1-g2);
微分+=数学abs(b1-b2);
diff/=255;//更改-确保结果介于0到255之间
//对图像灰度进行差分
//RGB组件都是相同的
结果=(差异您可以尝试

BufferedImage yourFile =
可以创建颜色模型(例如,请参见链接)

private static ColorModel createColorModel(int n){
//创建一个简单的颜色模型,所有值映射到
//一片灰色
//注意,这可以通过重用字节数组来改进
字节[]r=新字节[16];
字节[]g=新字节[16];
字节[]b=新字节[16];
对于(int i=0;i
您可以尝试

BufferedImage yourFile =
可以创建颜色模型(例如,请参见链接)

private static ColorModel createColorModel(int n){
//创建一个简单的颜色模型,所有值映射到
//一片灰色
//注意,这可以通过重用字节数组来改进
字节[]r=新字节[16];
字节[]g=新字节[16];
字节[]b=新字节[16];
对于(int i=0;i
您可以尝试

BufferedImage yourFile =
可以创建颜色模型(例如,请参见链接)

private static ColorModel createColorModel(int n){
//创建一个简单的颜色模型,所有值映射到
//一片灰色
//注意,这可以通过重用字节数组来改进
字节[]r=新字节[16];
字节[]g=新字节[16];
字节[]b=新字节[16];
对于(int i=0;i
您可以尝试

BufferedImage yourFile =
可以创建颜色模型(例如,请参见链接)

private static ColorModel createColorModel(int n){
//创建一个简单的颜色模型,所有值映射到
//一片灰色
//注意,这可以通过重用字节数组来改进
字节[]r=新字节[16];
字节[]g=新字节[16];
字节[]b=新字节[16];
对于(int i=0;i
尝试更改计算颜色差异的代码,而不是将每个颜色通道设置为相同并生成灰度,尝试将每个颜色通道设置为各自的差异,而不是将每个颜色通道中的差异相加。换句话说,尝试以下操作:

// Modified - Changed to int as pixels are ints
int rDiff, gDiff, bDiff;
int result; // Stores output pixel
for (int i = 0; i < height1; i++) {
    for (int j = 0; j < width1; j++) {
        int rgb1 = img1.getRGB(j, i);
        int rgb2 = img2.getRGB(j, i);
        int r1 = (rgb1 >> 16) & 0xff;
        int g1 = (rgb1 >> 8) & 0xff;
        int b1 = (rgb1) & 0xff;
        int r2 = (rgb2 >> 16) & 0xff;
        int g2 = (rgb2 >> 8) & 0xff;
        int b2 = (rgb2) & 0xff;
        rDiff = Math.abs(r1 - r2); // Change
        gDiff = Math.abs(g1 - g2);
        bDiff = Math.abs(b1 - b2);
        result = (rDiff << 16) | (gDiff << 8) | bDiff;
        outImg.setRGB(j, i, result); // Set result
    }
}
//修改-更改为int,因为像素是int
int rDiff、gDiff、bDiff;
int result;//存储输出像素
对于(int i=0;i>16)和0xff;
int g1=(rgb1>>8)和0xff;
int b1=(rgb1)&0xff;
int r2=(rgb2>>16)和0xff;
int g2=(rgb2>>8)和0xff;
int b2=(rgb2)&0xff;
rDiff=Math.abs(r1-r2);//更改
gDiff=Math.abs(g1-g2);
bDiff=Math.abs(b1-b2);

结果=(rDiff尝试更改计算颜色之间差异的代码,而不是将每个颜色通道设置为相同并生成灰度,尝试将每个颜色通道设置为各自的差异,而不是将每个颜色通道中的差异相加。换句话说,尝试以下操作:

// Modified - Changed to int as pixels are ints
int rDiff, gDiff, bDiff;
int result; // Stores output pixel
for (int i = 0; i < height1; i++) {
    for (int j = 0; j < width1; j++) {
        int rgb1 = img1.getRGB(j, i);
        int rgb2 = img2.getRGB(j, i);
        int r1 = (rgb1 >> 16) & 0xff;
        int g1 = (rgb1 >> 8) & 0xff;
        int b1 = (rgb1) & 0xff;
        int r2 = (rgb2 >> 16) & 0xff;
        int g2 = (rgb2 >> 8) & 0xff;
        int b2 = (rgb2) & 0xff;
        rDiff = Math.abs(r1 - r2); // Change
        gDiff = Math.abs(g1 - g2);
        bDiff = Math.abs(b1 - b2);
        result = (rDiff << 16) | (gDiff << 8) | bDiff;
        outImg.setRGB(j, i, result); // Set result
    }
}
//修改-更改为int,因为像素是int
int rDiff、gDiff、bDiff;
int result;//存储输出像素
对于(int i=0;i>16)和0xff;
int g1=(rgb1>>8)和0xff;
int b1=(rgb1)&0xff;
int r2=(rgb2>>16)和0xff;
int g2=(rgb2>>8)和0xff;
int b2=(rgb2)&0xff;
rDiff=数学绝对值(r1-r2);