8

投稿する前に、ウェブ全体を実際に検索しました。私の問題は、画像の品質を失うことなくビットマップのサイズを変更できないことです (品質は非常に悪く、ピクセル化されています)。

カメラからビットマップを取得し、それをダウンスケールする必要があるため、サーバーにはるかに高速にアップロードできます。

これは、サンプリングを行う関数です

public Bitmap resizeBitmap(Bitmap bitmap){
         Canvas canvas = new Canvas();
         Bitmap resizedBitmap = null;
         if (bitmap !=null) {
                int h = bitmap.getHeight();
                int w = bitmap.getWidth();
                int newWidth=0;
                int newHeight=0;

                if(h>w){
                    newWidth = 600;
                    newHeight = 800;
                }

                if(w>h){
                    newWidth = 800;
                    newHeight = 600;
                    }

                float scaleWidth = ((float) newWidth) / w;
                float scaleHeight = ((float) newHeight) / h;



                Matrix matrix = new Matrix();
                // resize the bit map
                matrix.preScale(scaleWidth, scaleHeight);

                resizedBitmap  = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);



                Paint paint = new Paint();
                paint.setAntiAlias(true);
                paint.setFilterBitmap(true);
                paint.setDither(true);

                canvas.drawBitmap(resizedBitmap, matrix, paint);



            }


        return resizedBitmap;   

これは、アクティビティ結果から画像を取得する方法です

 protected void onActivityResult(int requestCode, int resultCode,
             Intent data) {
         if(resultCode != RESULT_CANCELED){

         if (requestCode == 0) {
             if (resultCode == RESULT_OK) {


                    getContentResolver().notifyChange(mImageUri, null);
                    ContentResolver cr = this.getContentResolver();

                    try
                    {
                        b = android.provider.MediaStore.Images.Media.getBitmap(cr, mImageUri);
                        Log.d("foto", Integer.toString(b.getWidth()));
                        Log.d("foto", Integer.toString(b.getHeight()));
                        addPhoto.setImageBitmap(b);

                    }
                    catch (Exception e)
                    {
                        Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show();
                        Log.d("TAG", "Failed to load", e);
                    }



             }
         }

小さな画像サイズを取得する最善の方法は、カメラの解像度を設定することだと思い始めています。他の誰かが助けることができますか?

4

4 に答える 4

9

優れたダウンスケーリング アルゴリズム (最近傍のようなものではない) は、わずか 2 つのステップで構成されます (さらに、入力/出力画像のトリミングのための正確な Rect の計算):

  1. BitmapFactory.Options::inSampleSize->BitmapFactory.decodeResource()を使用して、必要な解像度にできるだけ近いが、それ未満ではない解像度にダウンスケールします
  2. Canvas::drawBitmap()を使用して少しダウンスケーリングすることにより、正確な解像度を取得します。

SonyMobile がこのタスクをどのように解決したかについて詳しく説明します: http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/

SonyMobile スケール utils のソース コードは次のとおりです: http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/

于 2014-04-21T01:59:47.100 に答える
2

ビットマップのサイズを変更するには、以下のコードを試してください。

 public Bitmap get_Resized_Bitmap(Bitmap bmp, int newHeight, int newWidth) {
        int width = bmp.getWidth();
        int height = bmp.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // CREATE A MATRIX FOR THE MANIPULATION
        Matrix matrix = new Matrix();
        // RESIZE THE BIT MAP
        matrix.postScale(scaleWidth, scaleHeight);

        // "RECREATE" THE NEW BITMAP
        Bitmap newBitmap = Bitmap.createBitmap(bmp, 0, 0, width, height, matrix, false);
        return newBitmap ;
    }

このコードを使用してビットマップのサイズを縮小しましたが、その品質はまあ..許容範囲でした。

お役に立てれば。

于 2013-05-09T15:47:05.517 に答える
1

Bitmap.createScaledBitmapを試してください。ソースをフィルタリングするオプションもあります。

于 2013-05-09T15:42:28.467 に答える