1

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

4

3 回答 3

5

对图形状态的转换只会影响后续的绘图操作——它们不会改变现有的图像数据。如果您想对图像应用变换,请尝试以下操作:

  1. 创建一个空的 CGContext(在 iPhone 上,使用 UIGraphicsBeginImageContext)
  2. 平移、缩放或旋转其图形状态
  3. 将现有图像绘制到其中。
  4. 从新的 CGContext 获取图像(在 iPhone 上,使用 UIGraphicsGetImageFromCurrentImageContext)

当您执行第 3 步时,现有图像将被绘制到您的新图形上下文中,并应用了转换。这里的诀窍是,为了应用转换,我们必须实际绘制一些东西。

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

于 2009-06-21T17:41:04.660 回答
1

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

所以你需要一个绘图操作。解决方案是创建一个 CGImage绘制该图像是一个绘图操作,因此它将受到当前变换矩阵(CTM)的影响。

一步步:

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

绘制图像,您必须调用 CGBitmapContextCreateImage() 。

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

于 2009-06-21T17:04:47.090 回答