1

私の仕事は、画像を ImageView に合わせて縦横比を維持することです。そのため、ImageView の縦横比を維持するために画像をトリミングする必要があります。

サイズ320x240のカメラからの画像があります。私の画面サイズは 480x320 (ランドスケープ モード) です。アプリケーションはランドスケープ モードでのみ動作しますが、フルスクリーンでは動作しません。

ImageView 塗りつぶしの親。レイアウト 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="fill_parent"
    android:orientation="vertical" >

    <ImageView 
        android:id="@+id/image" 
        android:layout_height="fill_parent"  
        android:layout_width="fill_parent" android:keepScreenOn="true" android:scaleType="fitCenter">
    </ImageView>

</LinearLayout>

image.getWidth() と image.getHeight() を使用すると、480x270 のサイズになります。

私のコード:

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    MySize msize = main.imageSize();

    //msize.height += 30; <----this fix my problem, but I dont undersand why?

    Size size = camera.getParameters().getPreviewSize();

    double kw = (double)size.width / (double)msize.width;
    double kh = (double)size.height / (double)msize.height;

    double k = Math.min(kw, kh);

    Log.d("INFO", "msize before" + msize);

    msize.width = (int)Math.ceil(msize.width * k);
    msize.height = (int)Math.ceil(msize.height * k);

    int left = (size.width - msize.width) / 2;
    int top = (size.height - msize.height) / 2;

    Log.d("INFO", "msize " + msize);
    Log.d("INFO", "size " + size.width + "x" + size.height);

    YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    yuvimage.compressToJpeg(new Rect(left, top, msize.width, msize.height), 80, baos);
    byte[] jdata = baos.toByteArray();
    Bitmap image = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);
    main.updateImage(image);
}

ここで、msize は ImageView のサイズ、size はカメラの画像サイズです。この後、カメラ画像は 320x180 にトリミングされ、結果は次のようになります。

https://www.dropbox.com/s/9e2xwdc6m88ty34/SC20120705-121813.png

ImageView の高さに 30 を追加すると、正しい結果が得られました。

私のAndroidは2.3.3です。

4

0 に答える 0