iPhone:使用 Quartz 2D 转换图像

发布于 2024-07-25 16:25:05 字数 1246 浏览 10 评论 0原文

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

I am trying to apply some transformations on images using a CGContextRef. I am using CGContextTranslateCTM, CGContextScaleCTM and CGContextRotateCTM functions, but to keep things simple lets focus on just the first. I was wondering why the following code produces exactly the original image?! Am I missing something?

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 );

Also, after translating, how to draw another image over this one but with partial transparency (eg alpha = 0.5).

I searched alot but didn't find an answer, any help is appreciated... :)

Please note that I am creating the context from pixelData, and that tempImg is created after the translation. There is nothing wrong in the initialization, as the original image is being currently produced, but the issue is with the translation I suppose..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

久夏青 2024-08-01 16:25:05

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

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

执行步骤 3 时,现有图像将通过应用的转换绘制到新的图形上下文中。 这里的技巧是,为了应用变换,我们必须实际绘制一些东西。

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

Transformations to the graphics state only affect subsequent drawing operations - they don't change the existing image data. If you want to apply transforms to an image, try something like this:

  1. Create an empty CGContext (on iPhone, use UIGraphicsBeginImageContext)
  2. Translate, scale, or rotate it's graphics state
  3. Draw existing image into it.
  4. Get image from new CGContext (on iPhone, use UIGraphicsGetImageFromCurrentImageContext)

When you perform step 3, the existing image is drawn into your new graphics context with the transformations applied. The trick here is that in order to apply the transformations, we have to actually draw something.

You can do some really cool things with transformations this way. You can draw half your image, apply some transforms, and draw some more.

甜心小果奶 2024-08-01 16:25:05

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

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

逐步:

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

As noted in other answers, transformations only apply to subsequent drawing operations; they don't affect the pixel buffer you started with.

So you need a drawing operation. The solution is to create a CGImage; drawing that image is a drawing operation, so it will be subject to the current transformation matrix (CTM).

Step-by-step:

  1. Create the context with empty pixel data. (If you pass NULL for the buffers, Quartz should create them for you. That works on the Mac, anyway.)
  2. Create the image with the pixel data you want to draw transformed.
  3. Transform the CTM in the context.
  4. Draw the image.
荒岛晴空 2024-08-01 16:25:05

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

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

You have to call CGBitmapContextCreateImage() after you draw the image.

Then you can draw another image on top of the first one and call CGBitmapContextCreateImage() again to get the second image. You can set the alpha using CGContextSetAlpha(ctx, alphaValue);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文