iOS:如何将UIView的自绘内容转换为图像(广泛的一般解决scheme返回空白图像)?

我的商业应用程序需要一个function,让用户用手指在UIView上绘制签名并保存(通过工具栏上的button单击),以便将其附加到单元上。 一旦工作完成,这些单元将被上传到服务器,并且已经支持通过Base64上传的相机图片附件,所以我只是想将采取的签名转换成UIImage

首先,我需要一个解决scheme来绘制签名,我很快find了一些来自苹果的示例代码,似乎符合我的要求: GLPaint

我将这个示例代码整合到了我的项目中,因为我使用ARC和Storyboards,并且不需要声音效果和调色板等,但是绘制代码是直接的副本。

整合似乎是成功的,因为我能够在视图上绘制签名。 所以,下一步是为绘制的签名添加保存/图像转换function。

我已经做了无数的search,并推出了几十个类似问题的线程,大多数人指出了完全相同的解决scheme:

(假设)

  • drawingView :subclassed 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相机拍摄的图片附件的支持,因此我最初假定image processing代码也应该在签名图像上工作。

但是,经过一些没有结果的search之后,我放弃了这个假设,拿了原来的GLPaint项目,只是添加了上面的几行代码,只是显示图像,它也完全是空白的。 所以,这是不是在UIView上的自绘内容或任何我失踪的代码的问题。

我对这个问题基本没有想法,希望有人能帮助我。

最好的问候Felix

我相信你的问题可能是你正试图从GL的情况下获取图像。 你可能会search周围的网页,但通常你所需要的只是在所有“绘制”调用完成后调用“glReadPixels”。类似这样的应该工作:

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

如果使用多重采样,则需要在缓冲区parsing并显示帧缓冲区已被绑定后调用此选项。