Objective-C/iphone - 改变像素颜色?

Mou*_*maa 3 iphone graphics image pixel objective-c

我的项目的目的:用户可以通过触摸屏幕将部件的颜色更改为图像,当他触摸任何区域时,应该更改此区域的颜色

我有很多想法,但我的想法是基于在视图中放置另一个图像(动态创建),但这些想法是内存昂贵的;

这该怎么做 ().

Nyx*_*0uf 5

您可以使用Core Graphics.将QuartzCore框架添加到您的项目中.

执行此操作的基本方法是在位图上下文中呈现图像:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bmContext = CGBitmapContextCreate(NULL, width, height, 8,bytesPerRow, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(bmContext, (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = originalWidth, .size.height = originalHeight}, cgImage);
Run Code Online (Sandbox Code Playgroud)

然后你可以获取对底层像素的引用:

UInt8* data = (UInt8*)CGBitmapContextGetData(bmContext);
Run Code Online (Sandbox Code Playgroud)

然后做像素操作:

const size_t bitmapByteCount = bytesPerRow * originalHeight;
for (size_t i = 0; i < bitmapByteCount; i += 4)
{
    UInt8 a = data[i];
    UInt8 r = data[i + 1];
    UInt8 g = data[i + 2];
    UInt8 b = data[i + 3];

    // Do pixel operation here

    data[i] = (UInt8)newAlpha
    data[i + 1] = (UInt8)newRed;
    data[i + 2] = (UInt8)newGreen;
    data[i + 3] = (UInt8)newBlue;
}
Run Code Online (Sandbox Code Playgroud)

最后从上下文中获取新图像:

CGImageRef newImage = CGBitmapContextCreateImage(bmContext);
Run Code Online (Sandbox Code Playgroud)