3

私はカメラで写真を撮り、それを回転させて拡大縮小するアプリをやっています。カメラが間違った回転画像を返すため、画像を回転する必要があり、サイズを縮小するために拡大縮小する必要があります。最初に、カメラから返された元の画像を一時ディレクトリに保存し、それを読み取って変更を加え、新しい画像を新しいファイルに保存します。マトリックスを使用して画像を回転およびスケーリングしようとしましたが、品質が低下します。次に、最初に Bitmap.createScaledBitmap でスケーリングしてから、マトリックスで回転させようとしましたが、結果はマトリックスのみを使用したものよりもさらに醜くなります。次に、最初に回転させてから、常に Bitmap.createScaledBitmap を使用してサイズを変更しようとしました。画質は落ちていませんが、回転後に拡大縮小すると伸びてしまい、幅と高さが反転しています。回転に応じて高さと幅を反転させようとしましたが、再び品質が低下します。これは私が書いた最後のコードです:

in= new FileInputStream(tempDir+"/"+photo1_path);
            out = new FileOutputStream(file+"/picture.png");
            Bitmap src = BitmapFactory.decodeStream(in);
            int iwidth = src.getWidth();
            int iheight = src.getHeight();
            int newWidth = 0;
            int newHeight = 0;

                newWidth = 800;
                newHeight = 600;

              // calculate the scale - in this case = 0.4f
              float scaleWidth = ((float) newWidth) / iwidth;
              float scaleHeight = ((float) newHeight) / iheight;

              // createa matrix for the manipulation
              Matrix matrix = new Matrix();
              // resize the bit map
              //matrix.postScale(scaleWidth, scaleHeight);
              int orientation = getOrientation(MyActivity.this,Uri.parse(tempDir+"/"+photo1_path));
              switch(orientation) {
                case 3:
                    orientation = 180;
                    break;
                case 6:
                    orientation = 90;
                   break;
                case 8:
                    orientation = 270;
                    break;
              }
              int rotate = 0;
              switch(orientation) {
                case 90:
                    rotate=90;
                    break;
                case 180:
                    rotate=180;
                    break;
                case 270:
                    rotate=270;
                    break;

              }
              // rotate the Bitmap
              matrix.postRotate(rotate);

              src =Bitmap.createScaledBitmap(src , newWidth, newHeight, false);
              // recreate the new Bitmap
              Bitmap new_bit = Bitmap.createBitmap(src, 0, 0,
                                src.getWidth(), src.getHeight(), matrix, true);
                      new_bit.compress(Bitmap.CompressFormat.PNG, 100, out);

何かアドバイス?

編集:画像を回転または拡大縮小するだけであれば、品質は低下しません。両方を行うと、画質が低下します。また、サイズを変更してスケーリングした後に画像を ImageView に配置しても、品質は失われません。品質が低下するのは、ファイルに保存するときだけです。

4

3 に答える 3

4

解決しました!BitmapFactory inSampleSize オプションを使用して画像のサイズを変更しましたが、画像の品質はまったく低下しません。コード:

BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inJustDecodeBounds = true;
Bitmap bm = BitmapFactory.decodeFile(tempDir+"/"+photo1_path , bmpFactoryOptions);


int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)600);
int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)800);

if (heightRatio > 1 || widthRatio > 1)
{
    if (heightRatio > widthRatio){
        bmpFactoryOptions.inSampleSize = heightRatio;
    } else {
        bmpFactoryOptions.inSampleSize = widthRatio; 
    } 
}

bmpFactoryOptions.inJustDecodeBounds = false;
bm = BitmapFactory.decodeFile(tempDir+"/"+photo1_path, bmpFactoryOptions);
//bm.compress(Bitmap.CompressFormat.PNG, 100, out);
/*Bitmap new_bit = Bitmap.createScaledBitmap(src , newWidth, newHeight, true);
            new_bit.compress(Bitmap.CompressFormat.PNG, 100, out);*/


// recreate the new Bitmap
src = Bitmap.createBitmap(bm, 0, 0,bm.getWidth(), bm.getHeight(), matrix, true);


//Bitmap dest = Bitmap.createScaledBitmap(new_bit , newWidth, newHeight, true);
src.compress(Bitmap.CompressFormat.PNG, 100, out);
于 2013-07-05T07:48:43.070 に答える
0

このメソッドを使用してビットマップを回転させます...

private Bitmap checkifImageRotated() {
    ExifInterface exif;
    try {
        exif = new ExifInterface(file.getAbsolutePath());
        int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
        int rotate = 0;
        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_270 :
                rotate = -90;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180 :
                rotate = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_90 :
                rotate = 90;
                break;
        }
        if (rotate != 0) {
            Bitmap bitmap = BitmapFactory.decodeFile(getTempFile().getPath());
            Matrix matrix = new Matrix();
            matrix.setRotate(rotate);
            Bitmap bmpRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
            recycle(bitmap);
            return bmpRotated;
        }
    }
    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}
于 2013-07-04T14:35:25.927 に答える