0

このリンクに従って画像のサイズを変更しています。
画像サイズは3264x2448で、サンプルサイズを計算すると24になりますが、画像は90度回転しています(左)。
幅が高さよりも大きい場合に発生します。
私は立ち往生しています。解決できません。

I am using accroding to http://developer.android.com/training/displaying-bitmaps/load-bitmap.html


public static String getCompressedImagePath(String orgImagePath,
        String storeImagePath) {
    if (orgImagePath == null) {
        return null;
    }
    Bitmap bitmap = decodeSampledBitmapFromResource(orgImagePath, 100, 100);
    String absolutePath = "";
    FileOutputStream fos = null;
    try {

        fos = new FileOutputStream(storeImagePath);
        bitmap.compress(getCompressionFormatType(orgImagePath),
                IMAGE_COMPRESS_FACTOR, fos);
        fos.flush();
        absolutePath = storeImagePath;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    } finally {
        try {
            if (fos != null) {
                fos.close();
                fos = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return absolutePath;
}

public static Bitmap decodeSampledBitmapFromResource(String orgImagePath,
        int reqWidth, int reqHeight) {
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(orgImagePath, options);
    options.inSampleSize = calculateInSampleSize(options, reqWidth,
            reqHeight);
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(orgImagePath, options);
}

public static int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {
    final int height = options.outHeight;
    final int width = options.outWidth;


    int inSampleSize = 1;
    if (height > reqHeight || width > reqWidth) {
        if (width > height) {
            inSampleSize = Math.round((float) height / (float) reqHeight);
        } else {
            inSampleSize = Math.round((float) width / (float) reqWidth);
        }
    }
    return inSampleSize;
}

また、decodeSampledBitmapFromResourceメソッドがリンクからコピーされ、圧縮された画像がintoimageviewに設定されています。

4

1 に答える 1

1

私はあなたのコードを使用し、サンプルアプリケーションで使用しましたが、正常に動作します。したがって、このアプリケーションを実行して、他に何が欠けているかを調べます

アクティビティ-ImageScaleTestActivity

    パッケージcom.myTutororial;

    java.io.Fileをインポートします。

    インポートcom.myTutororial.utils.ImageUtils;

    import android.app.Activity;
    android.graphics.Bitmapをインポートします;
    import android.graphics.BitmapFactory;
    android.os.Bundleをインポートします。
    android.view.Viewをインポートします。
    import android.view.View.OnClickListener;
    import android.widget.Button;
    android.widget.ImageViewをインポートします;

    パブリッククラスImageScaleTestActivityはActivity{を拡張します
        最終的な文字列SRC_IMAGE="/sdcard/Gallary/2.png";
        最終的な文字列CONVERTED_IMAGE="/sdcard/Gallary/Converted/1.png";
        ブールisConvertedImage;
        /**アクティビティが最初に作成されたときに呼び出されます。* /
        @オーバーライド
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            ボタンボタン=(ボタン)findViewById(R.id.button1);
            button.setOnClickListener(new OnClickListener(){
                public void onClick(View arg0){
                    isConvertedImage =!isConvertedImage;
                    if(isConvertedImage){
                        setImage(CONVERTED_IMAGE);
                    }そうしないと{
                        setImage(SRC_IMAGE);
                    }
                }
            });
            setImage(SRC_IMAGE);
            ImageUtils.getCompressedImagePath(SRC_IMAGE、CONVERTED_IMAGE);
        }

        public void setImage(String imagePath){
            ファイルimgFile=new File(imagePath);
            if(imgFile.exists()){

                ビットマップmyBitmap=BitmapFactory.decodeFile(imgFile
                        .getAbsolutePath());

                ImageView myImage =(ImageView)findViewById(R.id.imageView1);
                myImage.setImageBitmap(myBitmap);

            }

        }
    }

XML-main.xml

    <?xml version = "1.0" encoding = "utf-8"?>
    <LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:gravity = "center"
        android:orientation = "vertical">

        <ImageView
            android:id = "@ + id / imageView1"
            android:layout_width = "fill_parent"
            android:layout_height = "0dip"
            android:src = "@ drawable / ic_launcher" android:layout_weight = "1" />

        <ボタン
            android:id = "@ + id / button1"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:text="変換された画像を表示"/>

    </ LinearLayout>

IMAGEUTILS

    パッケージcom.myTutororial.utils;

    インポートjava.io.FileNotFoundException;
    import java.io.FileOutputStream;
    インポートjava.io.IOException;

    android.graphics.Bitmapをインポートします;
    import android.graphics.Bitmap.CompressFormat;
    import android.graphics.BitmapFactory;

    パブリッククラスImageUtils{
        public static String getCompressedImagePath(String orgImagePath、
                文字列storeImagePath){
            if(orgImagePath == null){
                nullを返します。
            }
            ビットマップビットマップ=decodeSampledBitmapFromResource(orgImagePath、100、100);
            文字列absolutePath="";
            FileOutputStream fos = null;
            試す {

                fos = new FileOutputStream(storeImagePath);
                ビットマップ.compress(CompressFormat.PNG、90、fos);
                fos.flush();
                AbsolutePath = storeImagePath;
            } catch(FileNotFoundException e){
                e.printStackTrace();
            } catch(IOException e){
                e.printStackTrace();
            } catch(NullPointerException e){
                e.printStackTrace();
            } ついに {
                試す {
                    if(fos!= null){
                        fos.close();
                        fos = null;
                    }
                } catch(例外e){
                    e.printStackTrace();
                }
            }
            絶対パスを返します。
        }

        public static Bitmap decodeSampledBitmapFromResource(String orgImagePath、
                int reqWidth、int reqHeight){
            最終的なBitmapFactory.Optionsオプション=新しいBitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(orgImagePath、options);
            options.inSampleSize =calculateInSampleSize(options、reqWidth、
                    reqHeight);
            options.inJustDecodeBounds = false;
            BitmapFactory.decodeFile(orgImagePath、options);を返します。
        }

        public static intcalculateInSampleSize(BitmapFactory.Options options、
                int reqWidth、int reqHeight){
            最終的なintの高さ=options.outHeight;
            最終的なint幅=options.outWidth;

            int inSampleSize = 1;
            if(height> reqHeight || width> reqWidth){
                if(幅>高さ){
                    inSampleSize = Math.round((float)height /(float)reqHeight);
                } そうしないと {
                    inSampleSize = Math.round((float)width /(float)reqWidth);
                }
            }
            inSampleSizeを返します。
        }

      }

于 2012-06-19T11:37:40.837 に答える