簡體   English   中英

如何使用正常的DataInputStream加載ARGB_8888圖像?

[英]How do I load an ARGB_8888 Image with a normal DataInputStream?

編輯:感謝您之前的回答和幫助! 我決定將這個問題修改為我真正需要的內容,對不起,因為之前沒有這么具體。

基本上標題就是所有信息,這就是我目前正在使用的信息:

int channels = 4;
int length = width * height;
int[] data = new int[length * channels];
int[][] channelPixels = new int[4][length];

for (int c = 0; c < channels; c++) {
    for (int i = 0; i < length; i++) {
        channelPixels[c][i] = readByte();
    }
}

不幸的是,顏色似乎與原件不符。

我在這里做錯什么了嗎?

Cardinal是一個無符號整數, Typename(value)Typename(value) Delphi語法。 (C語法中的等效項是(typename) value 。)所以Cardinal()不是函數,它將指針轉換為無符號整數。

正如一些人已經指出的, ^運算符是指針取消引用運算符。 dp^ := sp^意思是“將dp指向的值設置為等於sp指向的值。”

指針和指針遞增(例如在這里使用的)在Java中不存在,因此這會使您的工作變得更加棘手。 如果要在托管代碼中執行此操作,則需要按照數組重寫整個過程。

此代碼翻轉矩形緩沖區,並將RGBA字節順序更改為BGRA(反之亦然),如下所示:

a b c d e f g h
i j k l m n o p
=>
k j i l o n m p
c b a d g f e h

類似於c / java的偽代碼的粗略模擬:

src = array of byte with length (RawHdr.Width * RawHdr.Height * 4)
dst = array of byte with the same length

dstindex = 0

for (i = RawHdr.Height - 1; i >= 0; i--)
    {
     srcstartindex = i * RawHdr.Width * 4;
     for (j = 0; j < RawHdr.Width; j++)
         {  
           si = srcstartindex + j * 4;
           dst[dstindex] = src[si + 2];
           dst[dstindex + 1] = src[si + 1];
           dst[dstindex + 2] = src[si];
           dst[dstindex + 3] = src[si + 3];
           dstindex +=4;
         }
     } 

我不會為您編寫代碼,但是這些應該可以幫助您:

Cardinal從Google的第一個鏈接開始,它是基本的無符號整數類型,其大小不能保證。

^是指針取消引用。

暫無
暫無

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

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