int[][] 表示灰度图像,如何从有符号值转换为无符号值
int[][] representing a grayscale image, how to convert from signed to unsigned values
编辑 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, rRows,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。问题是当我尝试通过将它传递给 BufferedImage 来基于 int[][] 重建图像时,它变得太暗,更像是黑色和白色(主要是黑色)图像。
我看到建议在将 byte[] 转换为 in[][] 的过程中,将 256 添加到 DataBufferByte 生成的 byte[] 的每个子零值,但这实际上会产生一个全黑的图像和我真的不明白它的逻辑,比如你不想把整个规模移动 128,而不仅仅是负数吗??
当您编写转化时。您有一个带符号的字节,您需要将其转换为 ARGB 整数。
int unsignedByte = pixels[pixel]&0xff;
现在还没有完全完成,因为我们需要它 argb/grayscale。
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, 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);
}
}
编辑 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, rRows,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。问题是当我尝试通过将它传递给 BufferedImage 来基于 int[][] 重建图像时,它变得太暗,更像是黑色和白色(主要是黑色)图像。
我看到建议在将 byte[] 转换为 in[][] 的过程中,将 256 添加到 DataBufferByte 生成的 byte[] 的每个子零值,但这实际上会产生一个全黑的图像和我真的不明白它的逻辑,比如你不想把整个规模移动 128,而不仅仅是负数吗??
当您编写转化时。您有一个带符号的字节,您需要将其转换为 ARGB 整数。
int unsignedByte = pixels[pixel]&0xff;
现在还没有完全完成,因为我们需要它 argb/grayscale。
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, 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);
}
}