![](/img/trans.png)
[英]How can I load PNG-Files as ARGB_8888 even if they have no alpha channel?
[英]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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.