java - 在 Android 中将位图保存到文件中

标签 java android file bitmap

我有一个DrawingView类,它实现了绘画方法。当我画一些东西时它工作得很好,但是之后,当我尝试将我画的东西保存在 jpg 文件中时,我得到了一个黑色图像。我在 Stack Overflow 上读过很多答案,以及解释如何做到这一点的博客,但不明白为什么我仍然有黑色图像。这是我的代码:

绘图 View :

public class DrawingView extends View {
    private Path drawPath;
    private Paint drawPaint;
    private Paint canvasPaint;
    private Canvas drawCanvas;
    private Bitmap canvasBitmap;

    public DrawingView(Context context, AttributeSet attrs) {
        super(context, attrs);

        drawPath = new Path();
        drawPaint = new Paint();
        canvasPaint = new Paint(Paint.DITHER_FLAG);

        drawPaint.setColor(Color.BLACK);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(5f);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
    }

    public DrawingView(Context context) {
        super(context);

        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(Color.BLACK);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(5f);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(0xFFFFFF);
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawPath.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_UP:
            drawCanvas.drawPath(drawPath, drawPaint);
            drawPath.reset();
            break;

        default:
            return false;
        }
        
        invalidate();

        return true;
    }
}

我在这里使用:

public void btFirma_FRAGMENT_CIERRE(View v) {
    final DrawingView dv = new DrawingView(this);

    LayoutParams params = CierreFragment.getdvFirma().getLayoutParams();

    dv.setLayoutParams(params);
    dv.setDrawingCacheEnabled(true);
    dv.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    dv.layout(0, 0, v.getWidth(), v.getHeight());
    dv.buildDrawingCache(true);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setView(dv);
    builder.setPositiveButton("Aceptar", new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            Log.d("DialogFirma", "Se pulsa el botón aceptar del dialog");

            // TODO Establecer el nombre que se quiere asignar a la firma.
            imageName = "prueba.jpg";

            // TODO Guardar imagen de la firma en la carpeta /FIRMAS/
            saveImageSign(dv.getDrawingCache());

            Drawable background = getImageSign(imageName);

            if (background != null)
                CierreFragment.setdvBackGround(background);
        }
    });
    builder.setNegativeButton("Cancelar", new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            Log.d("DialogFirma", "Se pulsa el botón cancelar del dialog");
        }
    });

    builder.show();

}
private void saveImageSign(Bitmap finalBitmap) {
    File file = new File(
            ((AISApplication) getApplicationContext())
                    .getLocalFolderFIRMAS() + imageName);
    if (file.exists())
        file.delete();
    try {
        FileOutputStream out = new FileOutputStream(file);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();

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

private Drawable getImageSign(String imageName) {
    FileInputStream in;
    try {
        in = new FileInputStream(new File(
                ((AISApplication) getApplication()).getLocalFolderFIRMAS()
                        + imageName));

        Bitmap bmp = BitmapFactory.decodeStream(in);

        return new BitmapDrawable(getResources(), bmp);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}

谁能告诉我我的失败在哪里?

最佳答案

我没有太深入地研究你的代码,但这是我获取刚刚绘制的图像的方法:

private Bitmap getImage() {
 tile = Bitmap.createBitmap(faces[0]);      // create the bitmap (from existing or blank)         
 Canvas c = new Canvas(tile);               // create a new canvas using that bitmap
 c.drawBitmap(tile, 0, 0, null);            // draw the bitmap onto the canvas
                                            // do more drawing - here I add another image
 c.drawBitmap(scoresBm[initScores[0]], vertex.get(0).x, vertex.get(0).y, null);

 return tile;                               // just return the bitmap
}

保存图像

// write the image back out (using compression in this one)

try {
     FileOutputStream out = new FileOutputStream(imgFile);
    _bitmapScaled.compress(Bitmap.CompressFormat.JPEG, 50, out);
     out.flush();
     out.close();
    } catch (Exception e) {

关于java - 在 Android 中将位图保存到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22077939/

相关文章:

JavaFX 图表到图像到 Base64 字符串在 PHP 中的使用

java - 如何将用户踢到登录屏幕 Activity 并传递堆栈中的所有其他应用程序 Activity ?

file - VHDL 文件系统操作综合

android - android应用程序如何检测设备中的左右SD卡

android - Crashlytics 连接被拒绝 - 无法连接到无法连接到 api.crashlytics.com

C - 使用 StdIn 和 StdOut 通过逐位过程进行一次性密码本加密

python-3.x - 二进制文件类对象的正确类型

java - 在预先录制的 ONI 文件上使用 openNI 进行骨骼跟踪时出现异常

java - 在一行中调用两个同步方法会导致死锁吗?

java - 从我的DialogFragment中的MainActivity访问ArrayList <String>遇到麻烦