我正在尝试使用CGContextRef对图像应用一些转换。我正在使用CGContextTranslateCTM,CGContextScaleCTM和CGContextRotateCTM函数,但为了保持简单,我们只关注第一个。我想知道为什么下面的代码会产生完全原始的图像?!我错过了什么吗?
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef g = CGBitmapContextCreate((void*) pixelData,
width,
height,
RGBA_8_BIT,
bytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast);
CGContextSetShouldAntialias(g, YES);
CGContextSetInterpolationQuality(g, kCGInterpolationHigh);
CGContextTranslateCTM( g,translateX, translateY );
CGImageRef tempImg = CGBitmapContextCreateImage (g);
CGContextDrawImage( g, CGRectMake (0, 0, width, height), tempImg );
CGContextRelease(g);
CGColorSpaceRelease( colorSpace );
此外,在翻译之后,如何在这一个上绘制另一个图像但具有部分透明度(例如alpha = 0.5)。
我搜索了很多但没有找到答案,任何帮助都表示赞赏......:)
请注意我从pixelData创建上下文,并且在翻译后创建tempImg。初始化没有任何问题,因为原始图像当前正在生成,但问题在于我想的翻译..
答案 0 :(得分:5)
图形状态的转换仅影响后续的绘图操作 - 它们不会更改现有的图像数据。如果要将变换应用于图像,请尝试以下操作:
执行步骤3时,现有图像会在应用了变换的情况下绘制到新的图形上下文中。这里的诀窍是,为了应用转换,我们必须实际绘制一些东西。
你可以通过这种方式做一些非常酷的转换。您可以绘制一半图像,应用一些变换,然后绘制更多图像。
答案 1 :(得分:1)
如其他答案所述,转换仅适用于后续的绘图操作;它们不会影响你开始使用的像素缓冲区。
所以你需要一个绘图操作。解决方案是create a CGImage; drawing that image是一个绘图操作,因此它将受当前转换矩阵(CTM)的约束。
步骤一步:
NULL
,Quartz应该为您创建它们。无论如何,它适用于Mac。)答案 2 :(得分:-1)
您必须在绘制图像后调用CGBitmapContextCreateImage()。
然后,您可以在第一个图像的顶部绘制另一个图像并再次调用CGBitmapContextCreateImage()以获取第二个图像。您可以使用CGContextSetAlpha(ctx,alphaValue);
设置alpha