-1

キャンバスでオブジェクトを描画するアプリケーションがあります。そして、この写真を画像のように保存したい。たとえば、bmp、または jpg をフォルダーに。どうすればできますか?これが私のコードの一口です。

public class hell extends View{


public static int width= aktivita.width;    
public static int koeficient = 5;

final Paint mPaint;

public static int t;
public boolean filter = true;
static ArrayList<Circle> mCircles;


private static boolean Kontroler = true;





public void draw(Canvas canvas) {

     Paint p = new Paint();

     p.setColor(Color.RED);


            kres(canvas);


            invalidate();
        }
    }




public krouzky(Context context, AttributeSet atrs) {
    super(context, atrs);

    mMalovani = new Paint();
    mMalovani.setColor(Color.RED);
    mMalovani.setAntiAlias(true);

        createCircles();

}

描画用のオブジェクトの追加

public static void Prid() {

     int ran = aktivita.width/8;

    mCircles.add(new Circle(80, 200, ran));

}

配列リストを作る

private static void createCircles() { if (mCircles == null) { mCircles = new ArrayList<Circle>(); }

 int r = aktivita.width/8;
mCircles.add(new Circle(80, 200, r));

}

描画オブジェクト private void kres(Canvas canvas) {

        for (Circle c : mCircles) {
            // 
            canvas.drawCircle(c.getCurrentX(), c.getCurrentY(), c.getRadius(),
                    mPaint);


        }
        }

私はこれを試しましたが、ボタンクリックで開始した後、loadBitmapFromView(v); 保存(); 私のプログラムはシャットダウンし、SDカードには拡張子が.pngのファイルがあります。しかし、バイトは 0 で、開けません。

 public static Bitmap loadBitmapFromView(View view) {

        // width measure spec 
        int widthSpec = View.MeasureSpec.makeMeasureSpec(
                view.getMeasuredWidth(), View.MeasureSpec.AT_MOST);
        // height measure spec 
        int heightSpec = View.MeasureSpec.makeMeasureSpec(
                view.getMeasuredHeight(), View.MeasureSpec.AT_MOST);
        // measure the view 
        view.measure(widthSpec, heightSpec);
        // set the layout sizes 
        view.layout(view.getLeft(), view.getTop(), view.getMeasuredWidth() + view.getLeft(), view.getMeasuredHeight() + view.getTop());
        // create the bitmap
        Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        // create a canvas used to get the view's image and draw it on the bitmap 
        Canvas c = new Canvas(bitmap);
        // position the image inside the canvas 
        c.translate(-view.getScrollX(), -view.getScrollY());
        // get the canvas
        view.draw(c);

        return bitmap;
}

    public void save(){
 String fileName = String.valueOf(Calendar.getInstance().getTimeInMillis());
// generate the image path 
String imagePath = Environment.getExternalStorageDirectory().toString() + File.separator +  fileName + ".png";

 try {

     // save the image as png 
    FileOutputStream out = new FileOutputStream(imagePath);
    View view = null;
    // compress the image to png and pass it to the output stream 
    loadBitmapFromView(view).compress(Bitmap.CompressFormat.PNG, 90, out);

   // save the image 
   out.flush();
   out.close();

} catch (Exception error) {
      Log.e("Error saving image", error.getMessage());
}

    }
4

1 に答える 1

1

ビューからビットマップを取得するには:

public static Bitmap getBitmapFromView(View view) {
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(returnedBitmap);
    Drawable bgDrawable =view.getBackground();
    if (bgDrawable!=null) 
        bgDrawable.draw(canvas);
    else 
        canvas.drawColor(Color.WHITE);
    view.draw(canvas);
    return returnedBitmap;
}

SD カードに保存するには:

public void saveImage(Bitmap b)
{
    String path = Environment.getExternalStorageDirectory().toString();
    OutputStream fOut = null;

    File file = new File(path, "XXXXXXXXXXX.jpg");
    fOut = new FileOutputStream(file);

    b.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
    fOut.flush();
    fOut.close();
    MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());
}

MediaStore で挿入だけを行うこともできますが、品質が低下します。このようにして、必要な品質で圧縮が行われます。

編集:

FileNotFound 例外が発生する理由を理解するのに役立つログを追加しました。

public void saveImage(Bitmap b)
{
    String path = Environment.getExternalStorageDirectory().toString();
    OutputStream fOut = null;

    File file = new File(path, "XXXXXXXXXXX.jpg");
    Log.d("saveImage", "File to save: " + file.getAbsolutePath());

    try {
        FileOutputStream fOut = new FileOutputStream(file);
    }
    catch(FileNotFoundException e) {
        Log.d("saveImage", "Couldn't open file: " + e.getMessage());
    }

    if(fOut != null) {
        b.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
        fOut.flush();
        fOut.close();
        MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());
    }
}
于 2013-08-27T17:07:39.880 に答える