Android Bitmap.compress to png-仅当文件大小正确时保存

Android Bitmap.compress to png-仅当文件大小正确时保存,android,bitmap,compression,png,Android,Bitmap,Compression,Png,我有一个jpg,它是使用相机拍摄的,显示给用户(通过一些大小调整),最终保存为png 我首先使用 BitmapFactory.decodeFile(路径) 然后我使用 Bitmap.createScaledBitmap() 最后,我想使用 FileOutputStream fos=新的FileOutputStream(pngFile) bitmap.compress(bitmap.CompressFormat.PNG,100,fos) fos.flush() fos.close() 问题是最终的

我有一个jpg,它是使用相机拍摄的,显示给用户(通过一些大小调整),最终保存为png

我首先使用
BitmapFactory.decodeFile(路径)

然后我使用
Bitmap.createScaledBitmap()

最后,我想使用
FileOutputStream fos=新的FileOutputStream(pngFile)
bitmap.compress(bitmap.CompressFormat.PNG,100,fos)
fos.flush()
fos.close()

问题是最终的png文件不应该超过一定的大小(以字节为单位)。如果有,我想继续调整位图的大小,直到我的文件足够小。 在png压缩之前,我无法检查它(使用
bitmap.getAllocationByteCount()
-API19及更高版本,仍然是位图),因为位图总是比png大(至少从我看到的情况来看,包括我在paint中尝试的一些基本测试),并且png是我最后实际需要的

当然,我总是可以将png保存到磁盘,读取保存文件的长度,如果太大,则读取为位图,再次缩小,再次保存,等等。但我不喜欢这样做


还有其他方法吗?

影响最终PNG大小的因素很多。您可能有不同的压缩选项(想想“更快”和“更好”)。像
pngcrush
这样的工具可以将文件压缩得尽可能小。但是在PNG中使用的Flate算法在根上是不可预测的,如果不进行实际压缩,您无法预测输出的大小。@Jongware我不需要PNG尽可能小(当我说“小”时,我指的是字节大小,而不是像素)。它应该足够小。如果不是,我会把它缩小(不是问题),直到我得到一个足够小的文件。我知道我必须压缩它,我只是不想把它保存到磁盘上,直到我知道它确实足够小。当我最终得到一个足够小的png时,我会保存它。那么您现在正在实际编写一个文件(
FileOutputStream
),并“事后”检查其大小?你没有提到你正在使用哪种语言(Java?);也许您可以将输出流重定向到内存。它应该比写入文件快;当一个大小足够小时,可以将其写入磁盘。