【问题标题】:iPhone: Transforming an image using Quartz 2DiPhone:使用 Quartz 2D 转换图像
【发布时间】:2009-06-21 16:52:27
【问题描述】:

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

【问题讨论】:

    标签: iphone core-graphics quartz-graphics cgcontext


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你的明星!你的第一句话让我明白了一切,干杯:-)
    【解决方案2】:

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

    所以你需要一个绘图操作。解决办法是create a CGImagedrawing that image是绘图操作,所以会以当前的变换矩阵(CTM)为准。

    一步一步:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 请注意,我是从 pixelData 创建上下文,并且 tempImg 是在翻译后创建的。初始化没有任何问题,因为当前正在生成原始图像,但问题在于我想的翻译..
      • 啊,我明白你现在想做什么了。您不能使用 CGContextTranslateCTM 修改上下文缓冲区中的内容(或已绘制的内容)。上下文转换仅适用于之后将绘制的内容。因此,如果您想从数据中转换原始图像,则必须在第二个上下文中绘制它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多