操纵一个UIImage
问题描述:
我目前正在试图端口一个Java程序到IOS这utilzes的BufferedImage的.setRGB方法单独操作图片像素,像这样操纵一个UIImage
image.setRGB(x, y, color);
在Objective-C,我的单个像素使用UIImage代替BufferedImage,我想知道的是,如果有一种做Java的setRGB的等价方法,或者我必须将图像转换为字节数组,操纵像素,然后使用ImageWithData?
答
你必须将图像转换转换为位图,在位图上使用setRGB,然后用位图创建图像并绘制图像或将新图像分配给图像视图内容。
为什么?在应用的ARM代码无法访问GPU的另一侧,像素可能呈不透明格式。
答
下面是如何从图像获取像素数据的一个例子: 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;
+1
那么,你可以操纵你回来的数据,但那不改变图像。 –
答
这里是我最终使用设置像素
-(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;
}
答
您可以使用下面的方法来访问像素和操纵他们
-(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;
}
查看http://*.com/questions/1281210/can-i-edit-the-pixels-of-the-uiimages-property-cgimage –