我试图用一些变革对图像的使用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之后创建的翻译。没有什么错误的,在初始化,作为原始图像正在被目前生产的,但问题是翻译我想..

有帮助吗?

解决方案

转换到图形态仅影响到随后的绘图操作-他们不要更改现有的图像数据。如果你想要应用转变的图像,尝试这样的事情:

  1. 创建一个空CGContext(在iPhone,使用UIGraphicsBeginImageContext)
  2. 翻译的规模,或旋转它的形状态
  3. 绘制现有的图像进入它。
  4. 获得的图像从新CGContext(在iPhone,使用UIGraphicsGetImageFromCurrentImagecontext)

当你执行步骤3,现有的图像绘制入新的图形方面的变革应用。这里的诀窍是,为了适用的转变,我们实际上画的东西。

你可以做一些非常酷的事情转变的这种方式。你可以画你一半的图像,适用于一些转变,以及绘制更多一些。

其他提示

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

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

步骤一步:

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

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

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

设置alpha
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top