解決
@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 考え?