jjzjj

iOS:如何将UIView的自绘内容转成图片(普遍的通用方案返回空白图片)?

coder 2024-01-26 原文

我的业务应用程序需要一项功能让用户在 UIView 上签名用他的手指保存它(通过单击工具栏中的按钮),这样它就可以附加到一个单元上。这些单元将在工作完成后上传到服务器,并且已经支持通过 Base64 上传的相机图片附件,所以我只想将拍摄的签名转换为 UIImage。 .

首先,我需要一个签名的解决方案,我很快从苹果公司找到了一些似乎符合我要求的示例代码: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 上下文中获取图像。您可能会在网上搜索它,但通常您需要的只是在所有“绘图”调用完成后调用“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:如何将UIView的自绘内容转成图片(普遍的通用方案返回空白图片)?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  9. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  10. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

随机推荐