我的企业应用程序需要一项功能来让用户在UIView
上绘制签名用手指保存它(通过单击工具栏中的按钮),以便可以将其附加到单元上。一旦工作完成,这些单元将被上传到服务器,并且已经支持通过 Base64 上传的相机图片附件,所以我只想将签名转换为 UIImage
.
首先,我需要一个绘制签名的解决方案,我很快从Apple找到了一些似乎满足我要求的示例代码:GLPaint
我将此示例代码集成到我的项目中,并稍加修改,因为我使用 ARC 和 Storyboard,并且不需要声音效果和调色板等,但绘图代码是直接复制。
集成似乎很成功,因为我能够在 View 上绘制签名。因此,下一步是为绘制的签名添加保存/图像转换功能。
我进行了无休止的搜索,并滚动了数十个询问类似问题的线程,其中大多数都指向完全相同的解决方案:
(假设)
- 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
上的自绘内容的问题。 s 或任何我丢失的东西。
我对这个问题基本上没有想法,希望有人能帮助我。
最诚挚的问候 菲利克斯
最佳答案
我相信您的问题可能是您正在尝试从 GL 上下文获取图像。您可能会在网络上搜索该内容,但通常您需要的只是在所有“draw”调用完成后调用“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;
}
如果您使用多重采样,则需要在解析缓冲区并绑定(bind)呈现帧缓冲区后调用此函数。
关于iOS:如何将UIView的自绘内容转换为图像(广泛的通用解决方案返回空白图像)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13229852/