为什么Android在尝试渲染到Prawn PDF时捕获了PNG的错误

时间:2015-07-13 21:54:24

标签: android amazon-s3 imagemagick zlib prawn

我有一个ios / android应用程序需要用户在屏幕上签名,然后该应用程序会捕获此签名的屏幕截图。在大多数情况下,此过程正常。在少数情况下,通常与三星Android手机相关,当我尝试从手机渲染S3存储的屏幕截图时,服务器上的PRAWN PDF会抛出以下错误。

Zlib::Inflate.inflate(@img_data)
Zlib::DataError: incorrect data check

我无法从中获取更多错误信息,所以我决定深入研究并仔细查看该文件的基础数据。我的第一次尝试是使用ImageMagick打开文件。

ImageMagick将创建一个图像文件对象,如下所述,

#<MiniMagick::Image:0x007f83b47c9bf8 @path="/var/folders/g2/57tbfl691hg1gyqjkgy4vd6m0000gn/T/mini_magick20150713-2121-6y1as5.png", @tempfile=#<Tempfile:/var/folders/g2/57tbfl691hg1gyqjkgy4vd6m0000gn/T/mini_magick20150713-2121-6y1as5.png (closed)>, @info=#<MiniMagick::Image::Info:0x007f83b47c9bd0 @path="/var/folders/g2/57tbfl691hg1gyqjkgy4vd6m0000gn/T/mini_magick20150713-2121-6y1as5.png", @info={"raw:%m %w %h %b"=>"PNG 2560 970 59926B", "format"=>"PNG", "width"=>2560, "height"=>970, "dimensions"=>[2560, 970], "size"=>59926}>>

当我尝试最基本的图像文件操作时,我能想到,即从png转换为jpg,我收到以下错误,它引用了IDAT数据检查不正确,这种行为与PRAWN的错误一致即,&#39;不正确的数据检查&#39;。

MiniMagick::Error: `convert /var/folders/g2/57tbfl691hg1gyqjkgy4vd6m0000gn/T/mini_magick20150713-29731-1urceop.png[0] /var/folders/g2/57tbfl691hg1gyqjkgy4vd6m0000gn/T/mini_magick20150713-29731-10i6sg1.jpg` failed with error:
convert: IDAT: incorrect data check `/var/folders/g2/57tbfl691hg1gyqjkgy4vd6m0000gn/T/mini_magick20150713-29731-1urceop.png' @ warning/png.c/MagickPNGWarningHandler/1831.

我不清楚如何验证IDAT的预期值,甚至不清楚如何解释任何可能表明数据已损坏的模式。下面是导致PRAWN崩溃的图像的元数据。

{"x-amz-id-2"=>"BXkVr2k45L6zHSV31aq6tH3oCBp5C9Ncv0fD1zLOh5oW5D0PQHt1i+za3eAat/TezLZQfOyr43E=", "x-amz-request-id"=>"69601E81D15125AD", "date"=>"Mon, 13 Jul 2015 20:29:00 GMT", "last-modified"=>"Mon, 13 Jul 2015 19:14:49 GMT", "etag"=>"\"fe1da1ea421864ddadde17147bbb82a9\"", "accept-ranges"=>"bytes", "content-type"=>"image/png", "content-length"=>"59926", "server"=>"AmazonS3"} 

Android上用于捕获屏幕截图的代码如下所示。

original_image = cropImageView.getCroppedImage()
ByteArrayOutputStream stream = new ByteArrayOutputStream();
original_image.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
stream.close();

通常,捕获的文件总是被成功捕获,存储和检索,但任何处理这些特定文件的尝试都会导致PRAWN错误。我不清楚采用这种调试的方向,并且非常希望了解如何继续进行。

使用运行Android 5.0.1的三星Android Galaxy Note 4捕获的示例图像存储在此处,https://s3-us-west-2.amazonaws.com/bcamarda/original_broken.png以供参考和/或修改,如果需要的话。

0 个答案:

没有答案