android - 截图压缩质量损失

标签 android screenshot

也许其他人也遇到过这个问题: 正如标题所示,当将屏幕截图从设备上传到我们的服务器时,图像质量下降相当高。您可以在以下链接中查看一个示例 http://cdn.voicebo.com/7507-05e6a7b3bf91d96b2d08da649c2ef590.jpg

此屏幕截图是在 Nexus 4 上拍摄的,但在 Galaxy S2、S3 和 Note 2 上也会发生同样的情况。不幸的是,我们目前没有更多手机可以对此进行测试,但考虑到以下型号的受欢迎程度,这会影响我们的大量用户.

我已经搜索了相当长的时间来寻找可能发生这种情况的答案或原因,并发现以下链接并不是我真正想要的,但包含一些信息 http://www.google.rs/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCYQFjAA&url=http%3A%2F%2Fandroidforums.com%2Fsamsung-galaxy-s3%2F580114-screenshot-glitch.html&ei=1dKdUbPNA8nBO7G9gPgE&usg=AFQjCNECq7UNMp16pU8WLMlLwZVb4i2Ofw

我还得出结论,屏幕截图图像保存为 png 文件,而相机图像为 jpeg 文件(我认为这对于所有 ROM 都是相同的,但可能是错误的),所以这也可能是问题所在。我不明白的是为什么这会成为一个问题,因为据我所知,当您从任何支持的格式读取图像文件时,您会获得该图像的原始数据字节,因此如果原始字节,输入格式不应在输出压缩中发挥作用读取无误。
图像压缩中代码的相关部分仅此而已,但如果需要更多信息,我可以添加更多信息:

bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);

我要问的问题是: 有其他人遇到过这个问题吗?你是如何解决的? 我应该如何压缩 png 图像(使用什么设置)才能以合理的文件大小获得最佳结果?

奖励:我目前正在尝试一种方法来检测图像的文件格式,但如果有人用它来解决类似的问题,请在回答中提及。 编辑:How to get the Image Format of the images from Gallery是我现在用来获取图像格式的部分,但这实际上并没有回答问题。感谢所有在场的人进行了有益的讨论。

最佳答案

现在您已经提到了 options.inSampleSize 设置,您的问题很可能是由此引起的:设置 options.inSampleSize = 4 告诉编码器扔掉像素(显然是字面意思;正确的重采样看起来比您的示例更好),这正是您所看到的。

您需要做出一些决定,确定哪些内容应该缩小,哪些内容不应该缩小 - 您在评论中说,此设置应该由输入范围确定,所以听起来您已经在这样做了,也许您那里需要一些调试。

我重申,将 PNG 更改为 JPEG 可能不是最佳选择,除非您的屏幕截图经常包含照片内容。您可能知道,PNG 在压缩照片内容方面非常差,但相反,JPEG 在保持计算机/设备屏幕上常见的各种图像的质量方面非常差。在这种情况下,PNG 通常可以生成比可接受的 JPEG 图像更小的文件。

关于android - 截图压缩质量损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16710277/

相关文章:

android - 如何在Android(SQlite)中将本地存储数据从一台设备传输到另一台设备

java - 尝试在 Android Studio 中打开 Unity Activity 会产生 android.content.res.Resources$NotFoundException : String resource ID #0x0

java - 试图更改 setText() 方法的对齐方式?

android - 找不到与给定名称匹配的资源(在 'theme' 处,值为 '@style/AppTheme.AppBarOverlay' )

dart - 如何在 flutter 中截取屏幕外的小部件的屏幕截图?

android - 列索引顺序 SQLite 创建表

c# - CopyFromScreen 是获取屏幕截图的正确方法吗?

ios - UINavigationBar 中的 UISegmentedControll 奇怪的截图 iOS

android - getDrawingCache() 总是返回 null

wpf - WPF 应用程序的屏幕截图作为 SVG/矢量图形?