有没有办法减小PNG大小?

问题描述 投票:3回答:4

bm.compress(Bitmap.CompressFormat.PNG, 50, out); //here 50 will not work as PNG is lossless

如何缩小.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();
android png image-compression
4个回答
3
投票

1]如果预先定义了png,则可以使用tiny png服务来生成非常小的png。该服务将png大小减小了约60%,而没有任何明显的变化。2)如果您的png是在运行时创建/获取的,请尝试使用Bitmap.createScaledBitmap()方法。使用此方法,您可以创建小尺寸的png。

在方法中

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

100在PNG中被忽略。因为它是无损的。相反,您可以使用

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

这将为您提供较小的尺寸,并且压缩速度更快。


3
投票

我知道这很老了,但是我仍然会为将来的求职者解答。Android的Bitmap类在压缩PNG方面非常有限。它只会创建有限优化的PNG-32。打包您的apk文件的aapt程序确实优化了PNG文件。因此,当您解压缩PNG文件并将其读取为位图,然后使用bitmap类对其进行压缩时,将得到更大的文件。您可以使用pngj库,该库支持更好的PNG文件压缩。但是根据您的描述,您似乎并没有编辑应用程序中的文件,只是将资源复制到卡中,因此您所需要做的就是在raw文件夹中包含PNG文件,并检索流通过调用openRawResource()并将其直接复制到卡上。您可以在将[P0]文件添加到您的应用之前,通过使用TinyPNG对其进行进一步优化。


0
投票

您是否要严格遵守PNG? Bitmap.compressFormat.JPEG将能够压缩更多。

减小PNG文件大小的唯一方法是将PNG图像尺寸减小一些。我认为纯Android并非如此,但是可以使用一些图像库。

您还可以自己编写它,方法是创建一个新的Bitmap对象,并使用getPixels(...)手动从原始对象读取内容,将它们缩小比例,然后编写新对象。但我不建议这样做,调整大小可能很难使抗锯齿正常工作。


0
投票

您将保持位图的原样。对你有必要吗?如果不是这样,则可以将大小减小为bm.compress(Bitmap.CompressFormat.PNG, 50, outStream);。这里的50是被压缩的位图的质量。另一种选择是在将位图加载到内存之前使用Bitmap.Option

BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = false;
    options.inSampleSize = 3;
    try{
        mBitmapImage = BitmapFactory.decodeFile(mPhotoPath.replace("file://" , ""), options);
    }catch(Exception e){
        e.printStackTrace();
        throw new OutOfMemoryError("Device Out of Memory, can't obtain Bitmap");
    }

如果只想获取位图的大小,则设为options.inJustDecodeBounds = true。有助于防止应用程序的运行时崩溃

有关位图加载和压缩的更多信息,请参考开发人员文档https://developer.android.com/topic/performance/graphics/load-bitmap

位图类对PNG压缩没有太大帮助。它只会创建有限优化的PNG-32。 aapt确实优化了PNG文件。因此,当您解压缩PNG文件并将其读取为位图,然后使用bitmap类对其进行压缩时,将会得到更大的文件。您可以使用pngj库,该库支持更好的PNG文件压缩和优化。根据您的描述,您似乎并没有在应用程序中编辑文件,您可能只是将资源复制到卡中,因此您所需要做的就是在raw文件夹中包含PNG文件,然后检索通过调用openRawResource()方法对其进行流处理,然后将其直接复制到card。您可以先在TinyPNG之前将其原始PNG文件优化,然后再将其包含在应用中。

© www.soinside.com 2019 - 2024. All rights reserved.