0

ビットマップを縮小しようとしていますが、元の画像のようにエッジが明確ではなく、少しぼやけています

以下のリンクをチェックアウトしました

ビットマップのサイズ変更/スケーリング後の画質の低下

助けてください

 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,data.length);
           Matrix m=new Matrix();
           m.postRotate(90);
           //m.postScale((float)0.5,(float) 0.5);
           //Added for merging
           //Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
           Bitmap mutableBitmap = Bitmap.createBitmap(bitmap,0,0,600,400,m,false);

           Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);

           Canvas canvas = new Canvas(mutableBitmap);
           View v=(View)relLay.getParent();
           v.setDrawingCacheEnabled(true);
           v.buildDrawingCache();
           Options options = new BitmapFactory.Options();
           options.inScaled = false;
           //options.inJustDecodeBounds=true;
           options.inSampleSize=2;
           //Bitmap viewCapture = v.getDrawingCache().copy(Bitmap.Config.ARGB_8888, true);
          // Bitmap newImage = Bitmap.createScaledBitmap(viewCapture, viewCapture.getWidth()/2, viewCapture.getHeight()/2, true);
           ByteArrayOutputStream stream = new ByteArrayOutputStream();
           (v.getDrawingCache().copy(Bitmap.Config.ARGB_8888, true)).compress(Bitmap.CompressFormat.PNG, 100, stream);
           byte[] byteArray = stream.toByteArray();
           Bitmap viewCapture= BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length, options);


           v.setDrawingCacheEnabled(false);
           Rect src = new Rect(0, 0, viewCapture.getWidth(), viewCapture.getHeight());
           Log.d("TEST",""+viewCapture.getWidth()+" "+viewCapture.getHeight());
           //Destination RectF sized to the camera picture
            Rect dst = new Rect(0, 0, mutableBitmap.getWidth(), mutableBitmap.getHeight());
            Log.d("Test",""+mutableBitmap.getWidth()+" "+mutableBitmap.getHeight());
            canvas.drawBitmap(viewCapture, src, dst, paint);
           // Bitmap newImage = Bitmap.createScaledBitmap(viewCapture, 400,600, true);
            mutableBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);

拡大縮小しようとすると、viewCapture 要素がぼやけてしまう

4

1 に答える 1

1

お手伝いさせてください。

まず第一に、目的のカメラでキャプチャされた画像のサイズが 600*400 または同様のサイズである場合は、目的のサイズ (カメラでサポートされている) のカメラ パラメータを設定すると、カメラの画像撮影メソッドで小さな画像が取得されます。

注:ただし、最初に、デバイスカメラでサポートされている画像サイズを確認する必要があることを確認してください. 次に、それらのいずれかを設定します。

これは、Galaxy Nexus でテストした 1 つの例です。

Galaxy Nexus カメラがサポートする画像サイズ

サポートされている画像サイズ。幅: 2592 * 高さ: 1944

サポートされている画像サイズ。幅: 2592 * 高さ: 1728

サポートされている画像サイズ。幅: 2592 * 高さ: 1458

サポートされている画像サイズ。幅: 2048 * 高さ: 1536

サポートされている画像サイズ。幅: 1600 * 高さ: 1200

サポートされている画像サイズ。幅: 1280 * 高さ: 1024

サポートされている画像サイズ。幅: 1152 * 高さ: 864

サポートされている画像サイズ。幅: 1280 * 高さ: 960

サポートされている画像サイズ。幅: 640 * 高さ: 480

サポートされている画像サイズ。幅: 320 * 高さ: 240

以下はあなたを助けるサンプルコードです

CameraActivity.java

public class CameraActivity extends Activity implements SurfaceHolder.Callback,
        OnClickListener 
{

Camera camera;
SurfaceHolder surfaceHolder;
boolean previewing = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        getWindow().setFormat(PixelFormat.UNKNOWN);
        surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
          surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)    
    {
        // TODO Auto-generated method stub
    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) 
    {
        // TODO Auto-generated method stub
        Log.v(TAG, "surfaceCreated get called");
        camera = Camera.open();
        camera.setDisplayOrientation(90); //to get portrait display


        if (camera != null) {
            try {

                //Here is the main logic
                // We are setting camera parameters as our desired picture size

                Camera.Parameters parameters = camera.getParameters();              
                List<Size> sizes = parameters.getSupportedPictureSizes();

                Camera.Size result = null;
                for (int i=0;i<sizes.size();i++)
                {
                    result = (Size) sizes.get(i);
                    Log.i("PictureSize", "Supported Size. Width: " + result.width + "height : " + result.height); 

                    if(result.width == 640)
                    {
                        parameters.setPreviewSize(result.width, result.height);//640*480
                            parameters.setPictureSize(result.width, result.height);

                        //Now if camera support for 640*480 pictures size you will get captured image as same size
                    }
                    else
                    {
                        //to do here

                    }
                }  

                camera.setParameters(parameters);
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
                previewing = true;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        // TODO Auto-generated method stub
        Log.v(TAG, "surfaceDestroyed get called");
        camera.stopPreview();
        camera.release();
        camera = null;
        previewing = false;
    }
}

この中であなたのコメントを教えてください。

于 2013-10-01T07:56:09.017 に答える