iPhone:使用Quartz 2D转换图像

时间:2009-06-21 16:52:27

标签: iphone core-graphics quartz-graphics cgcontext

我正在尝试使用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。初始化没有任何问题,因为原始图像当前正在生成,但问题在于我想的翻译..

3 个答案:

答案 0 :(得分:5)

图形状态的转换仅影响后续的绘图操作 - 它们不会更改现有的图像数据。如果要将变换应​​用于图像,请尝试以下操作:

  1. 创建一个空的CGContext(在iPhone上,使用UIGraphicsBeginImageContext)
  2. 翻译,缩放或旋转图形状态
  3. 将现有图像绘制到其中。
  4. 从新的CGContext获取图像(在iPhone上,使用UIGraphicsGetImageFromCurrentImageContext)
  5. 执行步骤3时,现有图像会在应用了变换的情况下绘制到新的图形上下文中。这里的诀窍是,为了应用转换,我们必须实际绘制一些东西。

    你可以通过这种方式做一些非常酷的转换。您可以绘制一半图像,应用一些变换,然后绘制更多图像。

答案 1 :(得分:1)

如其他答案所述,转换仅适用于后续的绘图操作;它们不会影响你开始使用的像素缓冲区。

所以你需要一个绘图操作。解决方案是create a CGImage; drawing that image是一个绘图操作,因此它将受当前转换矩阵(CTM)的约束。

步骤一步:

  1. 使用像素数据创建上下文。 (如果您为缓冲区传递NULL,Quartz应该为您创建它们。无论如何,它适用于Mac。)
  2. 使用要绘制的像素数据创建图像。
  3. 在上下文中转换CTM。
  4. 绘制图像。

答案 2 :(得分:-1)

您必须在绘制图像后调用CGBitmapContextCreateImage()

然后,您可以在第一个图像的顶部绘制另一个图像并再次调用CGBitmapContextCreateImage()以获取第二个图像。您可以使用CGContextSetAlpha(ctx,alphaValue);

设置alpha