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

问题描述

编辑 3:

    int rRows = result.length;
    int rColums = result[0].length;

    BufferedImage img = new BufferedImage(rColums,rRows,BufferedImage.TYPE_BYTE_GRAY);
    for (int r = 0; r < rRows; r++) {
        for (int t = 0; t < result[r].length; t++) {
            img.setRGB(t,r,result[r][t]);   

编辑 2:

像这样创建图像....

 BufferedImage img = new BufferedImage(rColums,BufferedImage.TYPE_BYTE_GRAY)  


private static int[][] convertToArray(BufferedImage inputimage) {

final byte[] pixels = ((DataBufferByte) inputimage.getRaster().getDataBuffer()).getData(); 


final int width = inputimage.getWidth();

final int height = inputimage.getHeight();  
System.out.println("height" + height + "width");

int[][] result = new int[height][width];

for (int pixel = 0,row = 0,col = 0; pixel < pixels.length; pixeL++)     {

 int argb = 0;

  argb = (int) pixels[pixel];


result[row][col] = argb;

coL++;

if (col == width) {

 col = 0; 

 row++;

 }

 }

 return result;

                                                                                            

编辑:

我已经意识到我要问的是如何从有符号灰度到无符号灰度,正如我所说的添加 256 对我不起作用,而且这似乎仍然会使图像变暗,因为它不会升高+127 个有符号值到 256 个无符号值的值。(希望我已经正确表达了这一点。

根据标题,我通过

从缓冲图像中提取一个 int[][]
 ((DataBufferByte) inputimage.getRaster().getDataBuffer()).getData()

数组的范围从 -128 到 127。问题是当我尝试基于 int[][] 通过将其传递给 BufferedImage 来重建图像时,它显得太暗了,更像是一个黑白(主要是黑色)图像。

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

解决方法

当您编写转换文件时。您有一个有符号字节,需要将其转换为 ARGB int。

int unsignedByte = pixels[pixel]&0xff;

现在还没有完全完成,因为我们需要它是 argb/灰度。

argb = ( unsignedByte << 16 ) + ( unsignedByte << 8 ) + unsignedByte;

我忽略了 A 部分,只添加了 rgb 组件。不过这方面有很多documentation

这是一个完整的示例,您可以使用它。

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,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);
    }
}