0

解決

@ChandraSekhar の提案のおかげで、Immutable Bitmap を canvas コンストラクターに渡していたことが問題でした。解決策は、BitmapFactory.decodeFile(); を使用するときにそのコピーを作成することです。

Bitmap bmp = BitmapFactory.decodeFile(imageURL).copy(Bitmap.Config.ARGB_8888, true);

したがって、 bitmapFactory.decodeFile() を使用しているビットマップがあり、これは機能します。ビットマップを作成できたら、キャンバスを作成する必要があります。ここで奇妙なことが起こります。

ここまでが流れです。画像をキャプチャし、それを functionA に渡してサイズを調整し、保存してファイル パスを返します。(Phonegap Cordova を使用しています)

次に、その URL を Java に戻し、以前に保存した画像を使用して functionB で操作します。

問題のコード:

// GET URL TO IMAGE
final JSONObject options = optionsArr.optJSONObject(0);
String imageURL = options.optString("image");

// create image bitmap
Bitmap bmp = BitmapFactory.decodeFile(imageURL);
bmp = Bitmap.createBitmap(bmp,0,0,655,655);

/* Everything works fine until this point */

// create image canvas
Canvas canvas = new Canvas(bmp);
Bitmap one = Bitmap.createBitmap(bmp);
canvas.drawBitmap(one,0,0,null);

エラーは発生しません。ハングするだけです。これがズボンのキックです-別の関数を実行すると、最初に functionB と言って、一方は機能しますが、もう一方は機能しません。

最初の FileOutputStream をフラッシュして閉じる必要があるのではないかと考えましたが、効果はないようです。すべての要素、ビットマップ、キャンバス、およびファイル出力ストリームに対して異なる変数名を試しました。

ここに完全な機能の例があります... 注:phonegap / cordovaを使用しているため、文字列を返しています

public String none(JSONArray optionsArr) {

    // SET FILE PATH
            String filePath = "";
            File path = new File(Environment.getExternalStorageDirectory()+"/myApp/");

            // TMP.jpg is where we store our temporary version of the image
            File NewFilePath = new File(path, "tmp_NBB.jpg");

            // CREATE FOLDERS IF NEEDED
            try{
                boolean success = false;

                if(!path.exists()){
                    success = path.mkdir();
                }
                if (!success){ 
                    Log.d("NONE","Folder not created.");
                }
                else{
                    Log.d("NONE","Folder created!");
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
            // GET URL TO IMAGE
                final JSONObject options = optionsArr.optJSONObject(0);
                String imageURL = options.optString("image");

                // create image bitmap
                Bitmap bmp = BitmapFactory.decodeFile(imageURL);
                bmp = Bitmap.createBitmap(bmp,0,0,655,655);

                // create image canvas
                Canvas canvas = new Canvas(bmp);
                Bitmap none = Bitmap.createBitmap(bmp);
                canvas.drawBitmap(none,0,0,null);

                // SAVE IMAGE
                try {
                    // OUTPUT STREAM
                    FileOutputStream out = new FileOutputStream(NewFilePath);
                    none.compress(Bitmap.CompressFormat.JPEG, 100, out);

                    // GET FILE PATH
                    Uri uri = Uri.fromFile(NewFilePath);
                    filePath = uri.toString();

                    try{
                        out.flush();
                        out.close();

                        // RETURN FILE PATH
                        return filePath;
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }


                } catch (Exception e) {
                    e.printStackTrace();
                }
            return filePath;
        }

私が言ったように、これは最初の画像で機能しますが、この画像を再度開こうとすると、返されたファイルパスに基づいて、キャンバスの作成行でチャンクアウトします。

編集: 私が使用している画像パスは次のようになります: /mtn/sdcard/myApp/tmp.jpg 考え?

4

2 に答える 2

4
Bitmap one = Bitmap.createBitmap(bmp);

上記のコードでは、 bmpは Bitmap であり、 bmpからの Bitmap オブジェクトを作成しています。

その行を削除し、変更してみてください

canvas.drawBitmap(one,0,0,null);

canvas.drawBitmap(bmp,0,0,null);
于 2012-06-04T13:31:02.070 に答える
0

実行しているデバイスが画像サイズ: 655x655 をサポートしていることは確かですか? ビットマップは作成されますか?

于 2012-06-04T13:44:07.743 に答える