簡體   English   中英

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;

                                                                                            

編輯:

我已經意識到我要問的是如何將 go 從有符號灰度變為無符號灰度,正如我所說的那樣,添加 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/grayscale。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM