iOS:如何将UIView的自绘内容转换为图像(广泛的通用解决方案返回空白图像)?

时间:2012-11-05 10:06:45

标签: ios ios5 uiview uiimage signature

我的商家应用需要一项功能,让用户用手指在UIView上绘制签名并保存(通过工具栏中的按钮点击),以便将其附加到单元上。这些单元将在工作完成后上传到服务器,并且已经支持通过Base64上传的相机图片附件,因此我只想将签名转换为UIImage

首先,我需要一个解决方案来绘制签名,我很快发现Apple的一些示例代码似乎符合我的要求:GLPaint

我将此示例代码集成到我的项目中稍作修改,因为我使用ARC和Storyboard并且不想要声音效果和调色板等,但绘图代码是直接复制。

由于我能够在视图上绘制签名,因此集成似乎很成功。因此,下一步是为绘制的签名添加保存/图像转换功能。

我已经进行了无数的搜索并推出了几十个问题类似的问题并且他们中的大多数指出了完全相同的解决方案:

(假设)

  • drawingView :已完成绘图的子类UIView。)
  • <QuartzCore/QuartzCore.h>QuartzCore.framework包含在内
  • CoreGraphics.framework包含在内
  • 包含OpenGLES.framework

    - (void) saveAsImage:(UIView*) drawingView
    {
        UIGraphicsBeginImageContext(drawingView.bounds.size);
        [drawingView.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *image = UIGraphicsGetImageFromCurrentContext();
        UIGraphicsEndImageContext();
    }
    

最后我的问题:此代码对我不起作用,因为始终返回空白图片。由于我已经集成了对使用iPhone相机拍摄的图片附件的支持,我最初假设图像处理代码也适用于签名图像。

但是......经过一些没有结果的搜索后,我放弃了这个假设,采用了原来的GLPaint项目,只添加了上面的几行和一些只显示图像的代码,它也完全是空白的。因此,对于UIView上没有处理自绘内容的代码或者我缺少的任何内容,这是一个问题。

我基本上没有关于这个问题的想法,希望有些人可以帮助我。

祝你好运 菲利克斯

1 个答案:

答案 0 :(得分:1)

我相信你的问题可能是你试图从GL上下文中获取图像。您可以在网上搜索,但通常您只需要调用&#34; glReadPixels&#34;毕竟&#34;画&#34;已经打过电话..这样的事情应该有效:

BOOL createSnapshot;
int viewWidth, viewHeigth;
if(createSnapshot) {
    uint8_t *iData = new uint8_t[viewHeigth * viewWidth * 4];
    glReadPixels(0, 0, viewWidth, viewHeigth, GL_RGBA, GL_UNSIGNED_BYTE, iData);

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, iData, (viewWidth * viewHeigth * 4), NULL);
    CGColorSpaceRef cref = CGColorSpaceCreateDeviceRGB();
    CGImageRef cgImage = CGImageCreate(viewWidth, viewHeigth, 8, 32, viewWidth*4, cref, kCGBitmapByteOrderDefault, provider, NULL, NO, kCGRenderingIntentDefault);

    UIImage *ret = [UIImage imageWithCGImage:cgImage scale:1.0f]; //the image you need

    CGImageRelease(cgImage);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(cref);
    delete [] iData;

    createSnapshot = NO;
}

如果使用多重采样,则需要在解析缓冲区并将帧缓冲区绑定后调用此方法。