2012-02-08 101 views
1

我正在通过BitmapFactory加载jpeg文件并尝试再次保存它(后来我想在再次保存它之前对像素数据进行一些计算)。在Android中保存JPEG文件,不丢失像素信息

但是,如果我试图把它与

FileOutputStream fos = new FileOutputStream(new File("/sdcard/test.jpg")); 
originalImage.compress(Bitmap.CompressFormat.JPEG, 100, fos); 

保存那么它是不完全一样的结果作为原始图片。某些像素具有不同的颜色值,这对我以后的计算没有用。

是否有可能安全无损?或者是我在加载图片时出现问题

Bitmap originalImage = BitmapFactory.decodeFile("/sdcard/input.jpg"); 

之前几行?

回答

5

有没有可能安全无损?

否。JPEG格式使用有损压缩。这是没有正规担保的,即使你设置的质量为100

或者是问题已经当我加载与图片[...]

没有,位图.. 。位图,即它们表示图像数据的确切位。

+0

好吧,但是当我在一个普通的项目中用Java进行尝试时,我会用'BufferedImage originalImage = ImageIO.read(new File(“input.jpg”))来做到这一点。 ImageIO.write(originalImage,“jpg”,new File(“test.jpg”));'这将无损。可悲的是,Android不支持ImageIO,但是没有办法像这样做吗? – Steve 2012-02-08 15:18:46

+1

如果您不希望像素值发生变化,请使用像PNG这样的无损压缩 – BitBank 2012-02-08 15:22:53

+0

不幸的是,并不能保证* x = compressJpeg(decompressJpeg(x))*适用于所有* x *。 (对* x *的一些值和一些jpeg-algoritms,它*可能显然是这种情况,但不应该依赖它。)正如BitBank所说,使用PNG(或BMP)进行无损图像存储。 – aioobe 2012-02-08 15:58:10