2016-09-30 52 views
2

as bm.compress(Bitmap.CompressFormat.PNG, 50, out); //here 50 will not work as PNG is lossless有什么办法可以降低PNG大小?

如何缩小.png图片大小? 也只是应付外部位置从可绘制的文件大小增加5至10倍?

Bitmap bm=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher); 

String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); 

File file = new File(extStorageDirectory, "ic_launcher.PNG"); 
outStream = new FileOutputStream(file); 
bm.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
outStream.flush(); 
outStream.close(); 
+0

这样做的意义何在? (从drawable到外部应对) – Selvin

+0

@selvin可能会出现这种情况,您想要将所有可绘制的PNG放在用户文件夹中,以便用户可以在其他某些应用程序中使用这些PNG ... :) –

回答

0

您想严格遵守PNG吗? Bitmap.compressFormat.JPEG将能够压缩更多。

减少PNG文件大小的唯一方法是降低PNG图像尺寸更小的东西。我不认为这是纯粹的Android的直接,但有图像库,你可以用它来做到这一点。

您还可以通过创建一个新的位图对象,并从原来的使用的getPixels(...)手动阅读,pocessing他们缩减,并写入新的一个把它写自己。但我不会建议,调整大小可能会非常棘手,以便正确使用抗锯齿功能。

1

1)如果您的PNG是预先定义的,你可以使用tiny png服务有非常小的PNG图像。该服务正在减少约60%的png大小,没有任何明显的变化。 2)如果您的pngs在运行时创建/获取,请尝试使用Bitmap.createScaledBitmap()方法。用这种方法你可以创建小尺寸的PNG。

在该方法

bm.compress(Bitmap.CompressFormat.PNG, 100, outStream);

100 PNG的情况下被忽略。因为它是无损的。相反,你可以使用

bm.compress(Bitmap.CompressFormat.JPEG, 80, outStream); 

这一个会给你体积小,压缩速度更快。

1

我知道这是老了,但我依然会回答任何未来的求职者。
Android的位图类在压缩PNG方面相当有限。它只创建有限优化的PNG-32。 aapt程序,包装您的apk文件,确实优化了PNG文件。因此,当你解压并将你的PNG文件读入位图,然后用位图类压缩它时,你会得到一个更大的文件。
您可以使用pngj库,它支持更好的压缩PNG文件。
但是,根据您的描述,你似乎没有在应用程序编辑的文件,您刚刚从资源复制到卡上,因此,所有你需要做的是包括在raw文件夹中的PNG文件,并检索流通过拨打openRawResource()并直接复制到卡上。在将其包含在您的应用中之前,您可以使用TinyPNG进一步优化原始PNG文件。

相关问题