我使用Java中的代码,其中p1是Pixel类的对象,它访问数组像素并在适当的索引处为其赋值(在右侧)。 R G和B是一些int值。
p1.pixels[index] = 0xff000000 | (R << 16) | (G << 8 ) | B;
我在目标C中转换此代码的方法如下。但我不知道是否必须提及对象名称(在p1.pixels处插入对象)或在像素处插入对象是否相同?
int newNumber = 0xff000000 | (R << 16) | (G << 8 ) | B;
NSNumber *yourNumber = [NSNumber numberWithInt:newNumber];
[pixels insertObject:yourNumber atIndex:index];
答案 0 :(得分:2)
NSArrays没有Java阵列那样的硬件大小限制。它们从前面填充,没有默认值(Java中为null),并且不允许您插入到任意位置。
的唯一方法[pixels insertObject:yourNumber atIndex:index];
如果数组中已存在大于或等于yourNumber
个元素,行是安全的。
如果您确实需要该对象存在于某个索引处,您应该使用其他像素值填充较早的位置,或者使用[NSNull null]
此外,int
在不同的Mac和iOS设备上有不同的尺寸。如果你想要一个特定大小的整数,你应该使用像uint32
这样的类型之一,在每台机器上都保证是32位。
答案 1 :(得分:0)
我认为如果你正在操纵这样的像素,你最好(在性能和记忆方面)坚持使用普通的C语言。
如果您想从像素数据创建UIImage
对象,那么您将使用使用malloc()
分配的缓冲区;例如(代码取自here - 请参阅其余代码的问题):
char* rgba = (char*)malloc(width*height*4);
for(int i=0; i < width*height; ++i) {
rgba[4*i] = buffer[3*i];
rgba[4*i+1] = buffer[3*i+1];
rgba[4*i+2] = buffer[3*i+2];
rgba[4*i+3] = 255;
}
请注意,这是一个字节缓冲区,而不是uint32_t
缓冲区,因此请相应调整。
使用填充了NSArray
个对象的NSNumber
会慢很多,占用更多空间。