编辑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无符号。(希望我表达得正确。
根据标题,我从缓冲图像中通过
((DataBufferByte) inputImage.getRaster().getDataBuffer()).getData()
数组的范围从-128到127。问题是,当我试图通过将int[]传递给BuffereImage来基于int[]重建图像时,结果太暗,更像是黑白(大部分是黑色)图像。
我看到有人建议在将byte[]转换为in[][]的过程中,将DataBufferByte产生的byte[]的每个低于零的值添加256,但这实际上会产生一个完全黑色的图像,我真的不明白它的逻辑,就像你不想将整个比例移到128,而不仅仅是负数吗??
当你写你的转换。你有一个有符号的字节,你需要把它转换成一个ARGB整数。
int unsignedByte = pixels[pixel]&0xff;
现在,这还没有完全完成,因为我们需要它是argb/灰度。
argb = ( unsignedByte << 16 ) + ( unsignedByte << 8 ) + unsignedByte;
我忽略了A部分,只添加了rgb部分。虽然有很多关于这方面的文档。
这里是一个完整的例子,你可以玩。
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);
}
}
问题内容: 我必须将字节转换为有符号/无符号int或short。 下面的方法正确吗?哪个是签名的,哪个是未签名的? 字节顺序:LITTLE_ENDIAN VS。 和 VS。 我 只 对这种转换形式感兴趣。谢谢! 问题答案: 每对中的第一个方法()是带符号的,第二个()是无符号的。 但是,Java 始终是带符号的,因此,如果设置的最高位,则即使将其视为“无符号”版本,其结果也将为负。 假设值是-1或
为什么在C 11中无符号短*无符号短转换为int? int太小,无法处理这行代码显示的最大值。 MinGW 4.9.2溢流 因为(来源) USHRT_MAX=65535 (2^16-1)或更大* INT_MAX=32767 (2^15-1)或更大* 和(2^16-1)*(2^16-1)=~2^32。 这个解决方案会有什么问题吗? 此程序 给出输出 在…上 两者都有 这证明在这些编译器上,被转换为。
我正在解决一个问题,其中的任务是在用户提到的给定行输出pascal三角形的结果。 https://leetcode.com/problems/pascals-triangle-ii/ 我写了我的解决方案,其中有存储巨大阶乘结果的问题。 通过这些问题, 整数类型可以在C中存储哪些范围的值 长到无符号的字节数是多少? 并通过其他一些来源,我进行了以下更改,这给了我所需的结果。 由于“C”是int类型,
问题内容: 在C语言中,我可以使用数字做一些技巧: 在Swift中有没有办法做到这一点?请注意,相同的方法无效: 有没有一种方法可以让C的行为在Swift中减法? 谢谢! 问题答案: 所有有符号和无符号整数类型都有一个构造函数,该构造函数从具有相同内存表示形式的有符号(反之亦然)创建无符号数字:
问题内容: 假设我有这个号码。我如何将其称为无符号变量?像C一样 问题答案: 假设 : 您会想到2的补码表示法;和, 通过您 的意思是 32位无符号整数, 那么您只需将其添加为负值即可。 例如,将此应用于-1: 假设1表示您希望将-1视为一个1位的实字符串,而假设2表示您希望其中的32个。 但是,除了你,没人可以说你隐藏的假设是什么。例如,如果考虑到1的补码表示形式,则需要应用前缀运算符。Pyth
问题内容: 在Java中,是否有一种简单而优雅的方法将无符号字节值转换为有符号字节值?例如,如果我所拥有的只是int值240(二进制(24位+ 11110000)= 32bits),如何获得该int的带符号值? 问题答案: 除了,Java没有其他无符号值。考虑以下代码段: 结果将为-1,因为最低的8位已复制到byte变量中。