gpt4 book ai didi

objective-c - 旋转、更改颜色并从 NSImage 获取 RGB565 数据

转载 作者:行者123 更新时间:2023-12-03 17:03:59 29 4
gpt4 key购买 nike

我发现自己处于这样的情况:我有几个 NSImage 对象,我需要将它们旋转 90 度,将一种颜色的像素颜色更改为另一种颜色,然后将其作为 NSData 对象获取 RGB565 数据表示形式.

我在 Accelerate 框架中找到了 vImageConvert_ARGB8888toRGB565 函数,因此它应该能够执行 RGB565 输出。

我在 StackOverflow 上找到了一些 UIImage 旋转,但我在将它们转换为 NSImage 时遇到了麻烦,因为看起来我必须使用 NSGraphicsContext 而不是 CGContextRef?

理想情况下,我希望这些位于 NSImage 类别中,这样我就可以调用。

NSImage *rotated = [inputImage rotateByDegrees:90];
NSImage *colored = [rotated changeColorFrom:[NSColor redColor] toColor:[NSColor blackColor]];
NSData *rgb565 = [colored rgb565Data];

我只是不知道从哪里开始,因为图像处理对我来说是新的。

非常感谢我能得到的任何帮助。

编辑 (22/04/2013)

我已经设法将这段代码拼凑在一起以生成 RGB565 数据,它会颠倒生成它并带有一些小伪影,我认为第一个是由于使用了不同的坐标系,第二个可能是由于我从 PNG 转换而来到 BMP。我将使用 BMP 和非透明 PNG 进行更多测试。

- (NSData *)RGB565Data
{
CGContextRef cgctx = CreateARGBBitmapContext(self.CGImage);
if (cgctx == NULL)
return nil;

size_t w = CGImageGetWidth(self.CGImage);
size_t h = CGImageGetHeight(self.CGImage);
CGRect rect = {{0,0},{w,h}};
CGContextDrawImage(cgctx, rect, self.CGImage);

void *data = CGBitmapContextGetData (cgctx);
CGContextRelease(cgctx);

if (!data)
return nil;

vImage_Buffer src;
src.data = data;
src.width = w;
src.height = h;
src.rowBytes = (w * 4);

void* destData = malloc((w * 2) * h);

vImage_Buffer dst;
dst.data = destData;
dst.width = w;
dst.height = h;
dst.rowBytes = (w * 2);

vImageConvert_ARGB8888toRGB565(&src, &dst, 0);

size_t dataSize = 2 * w * h; // RGB565 = 2 5-bit components and 1 6-bit (16 bits/2 bytes)
NSData *RGB565Data = [NSData dataWithBytes:dst.data length:dataSize];

free(destData);

return RGB565Data;
}

- (CGImageRef)CGImage
{
return [self CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil];
}

CGContextRef CreateARGBBitmapContext (CGImageRef inImage)
{
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;


size_t pixelsWide = CGImageGetWidth(inImage);
size_t pixelsHigh = CGImageGetHeight(inImage);
bitmapBytesPerRow = (int)(pixelsWide * 4);
bitmapByteCount = (int)(bitmapBytesPerRow * pixelsHigh);

colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL)
return nil;

bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL)
{
CGColorSpaceRelease( colorSpace );
return nil;
}
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8,
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if (context == NULL)
{
free (bitmapData);
fprintf (stderr, "Context not created!");
}
CGColorSpaceRelease( colorSpace );

return context;
}

最佳答案

对于大多数情况,您需要使用 Core Image。

您可以使用 CIAffineTransform 过滤器进行旋转。这需要一个 NSAffineTransform 对象。您之前可能已经使用过该类。 (您可以使用 NSImage 本身进行旋转,但使用 Core Image 更容易,并且您可能需要在下一步中使用它。)

我不知道你所说的“将一种颜色的像素颜色更改为另一种颜色”是什么意思;这可能意味着很多不同的事情。不过,很可能有一个过滤器。

我也不知道为什么你特别需要 565 数据,但假设你确实需要它,那么你是正确的,将涉及该功能。使用CIContext's lowest-level rendering method to get 8-bit-per-component ARGB output ,然后使用该 vImage 函数将其转换为 565 RGB。

关于objective-c - 旋转、更改颜色并从 NSImage 获取 RGB565 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16139135/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com