【问题标题】:setRGB with BufferedImage provides incorrect coloring带有 BufferedImage 的 setRGB 提供了不正确的着色
【发布时间】:2016-02-07 09:23:08
【问题描述】:

我正在使用 BufferedImages,尤其是使用 setRGB。我所做的是获取确切的 RGBA 字节值并将它们重新应用到图像上以查看它们是否有效,并且图像不知何故被肢解了。我做错了什么?

BufferedImage subImg = inputImage.getSubimage(20,20,200,300);
byte[] pixels = ((DataBufferByte) subImg.getRaster().getDataBuffer()).getData();
int pixLength=0;
if(subImg.getAlphaRaster()!=null){
         for(int y=0; y<subImg.getHeight(); y++){
                    for(int x=0; x<subImg.getWidth(); x++){
                            inputImage.setRGB(20+x, 20+y,pixels[pixLength+3]<<24 + pixels[pixLength+2]<<16 + pixels[pixLength+1]<<8+pixels[pixLength]);
                            pixLength+=4;
                    }
         }
 }

根据这篇文章:Java - get pixel array from image

这似乎是正确的做法。但是,当我打印图像时,该小节现在看起来完全不同,即使它不应该改变。任何帮助将不胜感激!我还尝试使用具有 rgba 值的新颜色 setRGB,但这也不起作用。正在做

inputImage.setRGB(20+x, 20+y,((int)pixels[pixLength+3]&0xff)<<24 + ((int)pixels[pixLength+2]&0xff)<<16 + ((int)pixels[pixLength+1]&0xff)<<8+((int)pixels[pixLength]&0xff)]);

也不行。我真是一头雾水!

【问题讨论】:

    标签: java opencv byte bytearray bufferedimage


    【解决方案1】:

    顺序应该是:

    1. alpha (pixLength)
    2. 蓝色 (pixLength + 1)
    3. 绿色 (pixLength + 2)
    4. 红色 (pixLength + 3)

    另外,addition precedents shift;因此,您应该将 setRGB 更改为:

    inputImage.setRGB(20 + x, 20 + y, (((int)pixels[pixLength] & 0xff) << 24) + ((int)pixels[pixLength + 1] & 0xff) + (((int)pixels[pixLength + 2] & 0xff) << 8) + (((int)pixels[pixLength + 3] & 0xff) << 16)]);
    

    【讨论】:

    • 我试过了,但最终发生的是整个小节变得透明。不知道为什么
    • 您是否在每次添加之间添加了额外的括号?
    • 像素不能与 rgba 颜色正确吗?我检查了它的长度,它是 1283568,而它最多应该是 200*300*4 = 240,000。
    • 你的 inputImage 类型是什么?是 BufferedImage.TYPE_INT_ARGB 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多