2012-04-19 23 views
0

私はJPGファイルを操作する必要があるAndroid上でアプリケーションを作成しています。私はJPG形式のヘッダー情報をあまり得ていないので、ビットマップに変換し、ビットマップのピクセル値を操作してから再びJPGに変換します。AndroidでJPG画像のエンコードとデコード

ここで私が直面している問題は、ビットマップの一部のピクセルだけを操作した後に、JPGに戻して を元に戻すことです。私が以前に持っていたのと同じセットを取得しません。私は新しい画像の元の画像と同じ画像を取得しています。しかし、私は、復号化のために、新たな画像のピクセル値をチェックするとき、手つかずのピクセルが異なっている...私はどこか

...私はJPGピクセル値を操作するためにいくつかの他の方法を使用する必要があるかどうか間違っている場合

File imagefile = new File(filepath); 
FileInputStream fis = new FileInputStream(imagefile); 
Bitmap bi = BitmapFactory.decodeStream(fis); 
int intArray[]; 
bi=bi.copy(Bitmap.Config.ARGB_8888,true);  
intArray = new int[bi.getWidth()*bi.getHeight()]; 
bi.getPixels(intArray, 0, bi.getWidth(), 0, 0, bi.getWidth(), bi.getHeight()); 

int newArray[] = encodeImage(msgbytes,intArray,mbytes); // method where i am manipulating my pixel values 

// converting the bitmap data back to JPG file 
bi = Bitmap.createBitmap(newArray, bi.getWidth(), bi.getHeight(), Bitmap.Config.ARGB_8888); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
bi.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
byte[] data = baos.toByteArray(); 

Bitmap bitmapimage = BitmapFactory.decodeByteArray(data, 0, data.length); 
String filepath = "/sdcard/image/new2.jpg"; 
File imagefile = new File(filepath); 
FileOutputStream fos = new FileOutputStream(imagefile); 
bitmapimage.compress(CompressFormat.JPEG, 100, fos); 

が私を助けて

答えて

3

JPEGは、通常lossy compressionに基づいた画像形式です。つまり、ファイルサイズをさらに縮小するために、人間の目にとって重要ではない情報もいくつか取り除かれます。画像をPNG形式(無損失形式)で保存してみてください。

+0

ええ、私はJPGファイルに保存する必要があります。ほとんどのモバイルユーザーはJPG画像ファイルを使用しています....私はすべてのデータを取得することができますか? – Tani

+0

すべてのデータを_retrieveで意味するかどうかに依存します。デフォルトでは、JPEGは損失の多いフォーマットであり、JPEGでより多くの情報を失うことなく実行できる操作(クロッピングや回転など)はごくわずかです。少なくとも、SDKが提供するメソッドで画像を開いて保存すると、情報が失われます。 – Niels

0

は、あなたが最初biを持っている時点で

Bitmap bi = BitmapFactory.decodeStream(fis); 
bi = bi.copy(Bitmap.Config.ARGB_8888, true); 

を使用する場合は注意が必要ですあなたは既に代わりに(あまりにもデフォルトです)8888を強制的にBitmapFactory.Optionsを使用してみてください、多くの情報を失っている可能性があります

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
options.inDither = false; 
Bitmap bi = BitmapFactory.decodeStream(fis, options); 

copyと一緒に滞在すると、あなたはまだ捨てたものがrecycle()になります。

関連する問題