1

モバイルで写真をキャプチャしてからサーバーにアップロードするアプリケーションが 1 つあります。最初に写真のサイズを確認してから、実際の写真のサイズに応じて写真のサイズを特定のサイズに縮小したいと思います。実際にはサーバー上では、特定のサイズ (200 kb など) を超える写真は許可されません。

または、カメラの設定を変更しても、特定のサイズの写真のみをキャプチャするようにカメラを制限できますか。

写真の幅と高さを取得する多くの質問がここにあります。しかし、サイズをバイト単位でカスタマイズしたい。

cameraIntent を使用してカメラを開くには

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
4

3 に答える 3

2

これは、サイズを縮小するための唯一の解決策です。

public void onActivityResult(int requestcode, int resultcode, Intent data) {
        if (resultcode == RESULT_OK) {
            if (requestcode == SELECT_PICTURE) {
                Uri uri = data.getData();
                String imagePath = getPath(uri);
                int SCALE = 2;
                try{

                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = SCALE;
                Bitmap bitmap= BitmapFactory.decodeFile(imagePath, o2);
                OutputStream os = new FileOutputStream(imagePath);
                bitmap.compress(Bitmap.CompressFormat.PNG, 85, os);
                os.flush();
                os.close();
                File file = new File(imagePath);
                Log.i("Bitmap", "Height Width "+bitmap.getHeight()+" "+bitmap.getWidth());
                Log.i("File","Size in bytes "+file.length());
                while(file.length()>100*1024)
                {
                    SCALE +=2;
                    o2.inSampleSize = SCALE;
                    bitmap= BitmapFactory.decodeFile(imagePath, o2);
                    os = new FileOutputStream(imagePath);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 85, os);
                    os.flush();
                    os.close();
                    file = new File(imagePath);
                    Log.i("Bitmap", "Height Width "+bitmap.getHeight()+" "+bitmap.getWidth());
                    Log.i("File","Size in bytes "+file.length());
                }
                bitmap = BitmapFactory.decodeFile(imagePath, o2);

                }
                catch (Exception e) {
                    e.printStackTrace();
                }
                txtimagepath.setText(imagePath);

            }
        }
    }



protected String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int columnIndex = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(columnIndex);

    }
于 2012-10-29T06:40:23.550 に答える
1

結果のファイルのサイズを動的に指定してスケーリングを行うことはできません。高さと幅のサイズを変更する必要があります。これにより、ファイル サイズが小さくなります。

最終的にファイルサイズを制限内に保つことができる繰り返しのアプローチが役立つかもしれません。他に解決策が思い浮かびません。少なくとも、Android SDK はそのような API を提供していません。

幅/高さを維持したい場合は、圧縮技術を試すことができます。これにより、品質が低下し、最終的にファイルサイズが低下します. ただし、これを実現するための直接的な API はありません。

于 2012-10-29T06:13:52.513 に答える
0
Bitmap bt=Bitmap.createScaledBitmap(YourOrignalBitmap,320, 300, false);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bt.compress(Bitmap.CompressFormat.PNG,100, bos);

ここでサイズを修正し、画質を維持できます。

于 2012-10-29T06:15:20.723 に答える