Java int[][]表示灰度图像,如何从有符号值转换为无符号值

Java int[][]表示灰度图像,如何从有符号值转换为无符号值,java,bufferedimage,grayscale,Java,Bufferedimage,Grayscale,编辑3: 数组的范围从-128到127。问题是,当我试图通过将int[]]传递给BuffereImage来基于int[]重建图像时,图像太暗,更像是黑白(大部分是黑色)图像 在将字节[]转换为in[]]的过程中,我看到了一个建议,在DataBufferByte生成的字节[]的每一个次零值上加256,但这实际上产生了一个完全黑色的图像,我真的不明白它的逻辑,就像你不想把整个比例移128一样,而不仅仅是负数???当你写转换时。您有一个带符号的字节,需要将其转换为ARGB int ((DataBuf

编辑3:

数组的范围从-128到127。问题是,当我试图通过将int[]]传递给BuffereImage来基于int[]重建图像时,图像太暗,更像是黑白(大部分是黑色)图像


在将字节[]转换为in[]]的过程中,我看到了一个建议,在DataBufferByte生成的字节[]的每一个次零值上加256,但这实际上产生了一个完全黑色的图像,我真的不明白它的逻辑,就像你不想把整个比例移128一样,而不仅仅是负数???

当你写转换时。您有一个带符号的字节,需要将其转换为ARGB int

 ((DataBufferByte) inputImage.getRaster().getDataBuffer()).getData()
现在还没有完成,因为我们需要argb/灰度

int unsignedByte = pixels[pixel]&0xff;

argb=(unsignedByte您的问题包含光栅数据,但没有提到颜色模型。您应该在问题中解决这个问题,因为这就是问题所在。或者可能会有所帮助。您的意思是------buffereImage img=new buffereImage(rColums,rRows,buffereImage.TYPE_BYTE_GRAY)------这就是我创建新BuffereImage的方式“问题是,当我试图通过将int[]]传递给BuffereImage来重建基于int[]的图像时,结果太暗”你到底是怎么做到的?正如@ThomasFritsch已经正确地解释了如何从有符号到无符号的背面转换,问题很可能出在代码的这一部分。但我们只看到了另一半。@HaraldK Ok没有很好地发布这个问题。我已经更新了包含图像构造的内容。Thomas的答案已经不复存在了对我来说是红色的。效果是95%以上,图像有点暗,但非常正确。谢谢。有点暗的事实是否意味着我需要处理alpha组件?坦率地说,我有点困惑于这一切到底意味着什么,我对编程非常陌生,所以文档往往会给我留下更多的问题而不是答案,我是JUI don’我不想从我在网上找到的东西中拼凑出不同的片段。你有什么好书或网站可以推荐你来学习吗?再次感谢。啊,我把BuffereImage改为键入_INT_RGB,它显示得非常完美。仍然很困惑,但很高兴它能工作!它不是alpha部分,你可以使用<代码>整数rgb=(255我不确定是否有一本好书。图形处理和颜色空间可能非常深入。基本上,您知道颜色模型的数据类型byte。该方法假设提供的值是特定的数据类型和颜色空间。因此,当您设置RGB时,有一个计算将RGB值转换为模型中的近似值。奇怪的是,在我的代码中,输入图像的类型是_GRAY,但是当我使用setRGB()时,除非o/p BuffereImage的类型是_INT_RGB,否则它的显示不太正确。无论如何,非常感谢您的帮助。
 ((DataBufferByte) inputImage.getRaster().getDataBuffer()).getData()
int unsignedByte = pixels[pixel]&0xff;
argb = ( unsignedByte << 16 ) + ( unsignedByte << 8 ) + unsignedByte;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.util.HashSet;
import java.util.Set;
public class GrayScales{
    public static void main(String[] args){
        BufferedImage img = new BufferedImage( 256, 256, BufferedImage.TYPE_BYTE_GRAY );
        Graphics g = img.createGraphics();
        g.setColor( new Color( 128, 128, 128) );
        g.fillOval( 32, 32, 192, 192 );
        g.setColor( new Color( 255, 255, 255) );
        g.fillOval( 96, 96, 64, 64 );
        g.dispose();
        BufferedImage dup = new BufferedImage( 256, 256, BufferedImage.TYPE_BYTE_GRAY );
        byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
        Set<Integer> ints = new HashSet<>();
        for(int i = 0; i<256; i++){
            for(int j = 0; j<256; j++){
                int px = (pixels[j*256 + i])&0xff;
                ints.add(px);
                int rgb = (px << 16) + (px << 8) + (px);
                dup.setRGB(i, j, rgb);
            }
        }
        System.out.println(ints);
        JFrame frame = new JFrame("compare");
        JLabel a = new JLabel( new ImageIcon( img ) );
        JLabel b = new JLabel( new ImageIcon(dup) );
        
        frame.add(a, BorderLayout.EAST);
        frame.add(b, BorderLayout.WEST);
        frame.pack();
        frame.setVisible(true);
    }
}