[英]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.