2

アプリに機能を追加するためのガイドラインとして、このチュートリアルを使用しています。

http://developer.android.com/training/camera/photobasics.html

チュートリアルに付属の例は不完全で、いくつかの「間違い」があります。主なチュートリアルの目的がカバーされているため、単語の間違いを引用符で囲みます: カメラの操作.

撮影した大きなものからサムネイル写真を取得することに重点を置いています。この例を実行すると、指定されたディレクトリに正しく保存されているにもかかわらず、ほとんどの場合、大きな写真のサムネイルが表示されないことがすぐにわかります。

ちょっとした作業を行って、次の「間違い」を発見しました。

1.- メモリ不足によりアクティビティが破棄されるため、イメージのパス値が頻繁に失われます。メソッド onSaveInstanceState() に写真へのパスを保存することを修正しました。

このようにして、常に画像にアクセスできましたが、まだ表示されませんでした。私はいくつかのテストを続け、次のことを発見しました。

2.-ほとんどの場合、画像を再スケーリングするために画像ビューの測定値 (幅と高さ) を要求すると、値は 0 でした。描かれた。そこで、ハンドラーを使用して修正し、遅延メッセージ (1.5 インチ) を送信して実行しました。これで、メジャーは常に正しく取得されますが、ほとんどの場合、サムネイルは表示されません。

したがって、すべての変数が正しく設定されているにもかかわらず、 Bitmap.decodeFile メソッドが null 値を返していると思いました。しかしそうではなく、ビットマップを返しています。皆さん、サムネイルが表示されない理由がわかりません。

少し助けていただければ幸いです。ありがとう!

これは、画像を再スケーリングする方法です。

//Scaling the real size photo to the image view size
private void setImagenPequena()
{
    Log.w("PAth: ", n_path_foto_actual);
     // Get the dimensions of the View
    int targetW = n_iv_foto.getMeasuredWidth();
    int targetH = n_iv_foto.getMeasuredHeight();

    // Get the dimensions of the bitmap
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(n_path_foto_actual, bmOptions);
    int photoW = bmOptions.outWidth;
    int photoH = bmOptions.outHeight;

    Log.w("setImagenPequena: ", "photoW: " + Integer.toString(photoW));
    Log.w("setImagenPequena: ", "photoH: " + Integer.toString(photoH));
    Log.w("setImagenPequena: ", "targetW: " + Integer.toString(targetW));
    Log.w("setImagenPequena: ", "targetH: " + Integer.toString(targetW));

    if(targetW > 0 && targetH > 0)
    {
    // Determine how much to scale down the image
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
    bmOptions.inSampleSize = scaleFactor;
    }
    // Decode the image file into a Bitmap sized to fill the View
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(n_path_foto_actual, bmOptions);

    if(bitmap == null)
        Log.w("valor bitmap: ", "null");
    else
        Log.w("valor bitmap: ", "!=null");
    n_iv_foto.setImageBitmap(bitmap);

}
4

1 に答える 1

1

このチュートリアルにも多くの問題がありましたが、最終的に修正しました。私がしたこと :

  • 変化する

int scaleFactor = 数学. 最小(フォト W/ターゲット W、フォト H/ターゲット H);

int scaleFactor = 数学. max (photoW/targetW, photoH/targetH);

が鍵でした。その前に、写真ではなく空白の画像を取得しました。

  • ビューにデフォルトの画像を配置しました。万能の答えではないかもしれませんが、とにかくユーザーエクスペリエンスが向上すると思いました.
  • http://blog-emildesign.rhcloud.com/?p=590を使用して、decodeSampledBitmapFromFile の実際の例を取得できます。
  • それ以外の場合は、ここで私のコードの一部を使用してください:

    WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    mWidth = size.x;
    mHeight = size.y;
    ...
    
    private void setPic() {
    
            int targetW = mWidth;
            int targetH = mHeight;
            // Get the dimensions of the bitmap
            BitmapFactory.Options bmOptions = new BitmapFactory.Options();
            bmOptions.inJustDecodeBounds = true;
    
            BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
            int photoW = bmOptions.outWidth;
            int photoH = bmOptions.outHeight;
    
            // Determine how much to scale down the image
            int scaleFactor = Math.max(photoW/targetW, photoH/targetH);
            bmOptions.inPreferredConfig = Bitmap.Config.RGB_565;
            // Decode the image file into a Bitmap sized to fill the View
            bmOptions.inJustDecodeBounds = false;
            bmOptions.inSampleSize = scaleFactor;
            bmOptions.inPurgeable = true;
    
            Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath,                 
            bmOptions);
            mImageView.setImageBitmap(bitmap);
    }
    
于 2014-01-04T08:31:53.730 に答える