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

标签 ios ios5 uiview uiimage signature

我的企业应用程序需要一项功能来让用户在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/

相关文章:

ios - 如何检测电子邮件地址更改是否已还原?

ios - NSDate 给出了错误的答案(Objective-C)

ios - 如何在 iOS5 上复制 CIDarkenBlendMode

ios - 我目前正在检查 UIAlertController 是否存在以确定正在使用的操作系统版本。有没有更有效的方法来做到这一点?

ios - 如何在 UINavigationBar 上显示 UIView

iOS - 绘制渐变 - Swift

ios - 如何在锁定屏幕上显示与左下角相机相同的 iphone 应用程序图标

html - Safari Mobile iframe 内部 iframe 大小问题

jquery - touchstart PreventDefault in body = 无法聚焦输入

ios - 仅在 Objective C 中的 UIView 底部的底角半径和阴影