操纵UIImage的各个像素

时间:2011-12-01 19:14:01

标签: iphone objective-c cocoa-touch uiimage

我正在尝试将Java程序移植到iOs,它利用BufferedImage的.setRGB方法来单独操作图像的像素

image.setRGB(x, y, color);

在Objective-C中,我使用UIImage代替BufferedImage,我想知道的是,是否有相同的方法来处理Java的setRGB,或者我必须将图像转换为字节数组,操纵像素然后使用ImageWithData?

4 个答案:

答案 0 :(得分:2)

您必须将图像转换为位图,在位图上使用setRGB,然后使用位图创建图像并绘制它或将新图像指定给图像视图内容。

为什么呢? GPU的另一侧的像素可能是不透明的格式,应用程序的ARM代码无法访问它们。

答案 1 :(得分:1)

您可以使用以下方法访问像素并对其进行操作

 -(UIImage*) applyFilterContext:(void*)context
{
CGImageRef inImage = self.CGImage;
CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));
UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef);

int length =  CFDataGetLength(m_DataRef);

for (int i=0; i<length; i+=4)
{
    filterGreyScale(m_PixelBuf, i, context);
}


//Create Context
CGContextRef ctx = CGBitmapContextCreate(m_PixelBuf,
                                         CGImageGetWidth(inImage),
                                         CGImageGetHeight(inImage),
                                         CGImageGetBitsPerComponent(inImage),
                                         CGImageGetBytesPerRow(inImage),
                                         CGImageGetColorSpace(inImage),
                                         CGImageGetBitmapInfo(inImage)
                                         );

CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
CGContextRelease(ctx);
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CFRelease(m_DataRef);

return finalImage;

}

//将像素操作为灰度值

void filterGreyScale (UInt8 *pixelBuf, UInt32 offset, void *context)
{

int r = offset;
int g = offset+1;
int b = offset+2;

int red = pixelBuf[r];
int green = pixelBuf[g];
int blue = pixelBuf[b];

uint32_t gray = 0.3 * red + 0.59 * green + 0.11 * blue;

pixelBuf[r] = gray;
pixelBuf[g] = gray;
pixelBuf[b] = gray;

}

答案 2 :(得分:0)

以下是如何从图像中获取像素数据的示例: http://developer.apple.com/library/mac/#qa/qa1509/_index.html

然后你可以这样改变数据的颜色:

// Set the color of the pixel to 50% grey + 50% alpha
data[offset+0] = 128;
data[offset+1] = 128;
data[offset+2] = 128;
data[offset+3] = 128;

答案 3 :(得分:0)

以下是我最终用于设置像素的代码

-(void)setPixel:(UInt8*)buffer width:(int)width x:(int)x y:(int)y r:(int)r g:(int)g b:(int)b
{
    buffer[x*4 + y*(width*4)] = r;
    buffer[x*4 + y*(width*4)+1] = g;
    buffer[x*4 + y*(width*4)+2] = b;
}