当前位置: 首页 > 知识库问答 >
问题:

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

邹星火
2023-03-14

编辑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,而不仅仅是负数吗??

共有1个答案

田嘉慕
2023-03-14

当你写你的转换。你有一个有符号的字节,你需要把它转换成一个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变量中。