0

编辑:感谢之前的回答和帮助!我决定将这个问题编辑成我确切需要的内容,很抱歉之前没有那么具体。

基本上标题是所有信息,这是我目前正在使用的:

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

不幸的是,颜色似乎与原件不匹配。

我在这里做错了吗?

4

3 回答 3

3

Cardinal是一个无符号整数,并且Typename(value)是用于类型转换的 Delphi 语法。(C 语法中的等价物是(typename) value。)所以Cardinal()它不是一个函数,它将指针转换为无符号整数。

正如一些人已经指出的那样,该^运算符是指针解引用运算符。 dp^ := sp^意思是“将指向的值设置dp为等于指向的值sp”。

指针和指针递增,例如这里使用的,在 Java 中不存在,所以这让你的工作变得更加棘手。如果您想在托管代码中执行此操作,您需要做的是根据数组重写整个事情。

于 2012-08-15T23:43:55.790 回答
1

此代码翻转矩形缓冲区并将 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;
         }
     } 
于 2012-08-16T05:47:41.550 回答
0

我不会为您编写代码,但这些应该对您有所帮助:

Cardinal,来自 Google 上的第一个链接,它是基本的无符号整数类型,其大小无法保证。

^是指针解引用。

于 2012-08-15T22:53:33.757 回答