0

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);

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

4

2 に答える 2

3

JPEGは、通常、非可逆圧縮に基づく画像形式です。これは、ファイルサイズをさらに縮小するために、人間の目には重要ではない一部の情報が破棄されることを意味します。画像をPNG(ロスレス形式)として保存してみてください。

于 2012-04-19T18:53:38.113 に答える
0

使用上の注意

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

最初の情報を取得した時点で、biすでに多くの情報が失われている可能性があります。代わりにBitmapFactory.Options、強制的に使用してみてください8888(これもデフォルトです)。

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

あなたが一緒にいるなら、あなたはあなたが捨てるものをcopyまだ持っているべきです.recycle()

于 2016-04-07T22:44:47.817 に答える