保存时,位图会失去透明度

时间:2014-11-07 13:03:20

标签: android bitmap save transparency

当我尝试将位图保存到外部图片目录时,我遇到了问题。当我使用Bitmap.compress函数保存它时,位图失去透明度并使背景变黑。但是当我将位图传递给imageview并在活动中显示它时它看起来很好并且具有透明度。只有当我尝试保存它时,透明度才会变黑。

我不得不说,我使用两个位图和porterduff模式在位图上绘制路径并仅显示绘制路径中的图片,并且所有其他像素应该被剪切或透明。

所以这是创建路径位图的功能:

private void createPathBitmap(RectF rect, Bitmap bitmap, Path path) {
    RectF tmpRect = new RectF(rect);
    Bitmap src = Bitmap.createBitmap(bitmap, (int) tmpRect.left, (int) tmpRect.top, (int) tmpRect.width(), (int) tmpRect.height());
    Bitmap dst = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(dst);

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(mDisplayDensity * SnippetLayer.PATH_DIAMETER);
    path.offset(-rect.left, -rect.top);
    canvas.drawPath(path, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    RectF srcRect = new RectF(0, 0, rect.width(), rect.height());
    canvas.drawBitmap(src, null, srcRect, paint);
    BitmapManager.sBitmapSnippet = dst;
}

以下是将该位图保存到外部存储器的方法:

 SimpleDateFormat dateFormat = new SimpleDateFormat("HH_mm_ss_dd_MM_yyyy");
        File snippetFile = new File(picDir, fileName+"_"+dateFormat.format(new Date())+".png");
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(snippetFile);
            BitmapManager.sBitmapSnippet.setHasAlpha(true);
            BitmapManager.sBitmapSnippet.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

图片仅显示在路径中,边界框的其余部分为黑色且不透明。 我感谢任何帮助。

4 个答案:

答案 0 :(得分:9)

我使用compress()方法将位图写入输出流:

bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);

使用PNG格式很重要。 JPEG将透明背景转换为黑色。

答案 1 :(得分:4)

我不知道为什么它会失去透明度,但我遇到了同样的问题。您所要做的就是将BitmapManager.sBitmapSnippet.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);更改为BitmapManager.sBitmapSnippet.compress(Bitmap.CompressFormat.PNG, 0, fileOutputStream);。这将以完整质量压缩位图,但包含透明区域。

答案 2 :(得分:1)

不要因为这个小片段而失去透明度

这里的问题是您将图像保存为.JPEG,因此JPEG将黑色背景设为透明,因此我们将保存为.PNG,因此一定会获得透明图像

private void saveImage(Bitmap data, View view) {
    File createFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Magic PhotoShoot");
    if (!createFolder.exists())
        createFolder.mkdir();
    Calendar c = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String strDate = sdf.format(c.getTime());
    File saveImage = new File(createFolder, "Photoshoot_" + strDate + ".png");
    try {
        OutputStream outputStream = new FileOutputStream(saveImage);
        data.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
        outputStream.flush();
        outputStream.close();
        Snackbar.make(view, "Saved to PhotoShoot successfully", Snackbar.LENGTH_SHORT).show();
        isSave = true;
        Glob.savedImage = saveImage.getAbsolutePath();
        MediaStore.Images.Media.insertImage(getContentResolver(), saveImage.getAbsolutePath(), saveImage.getName(), saveImage.getName());
    } catch (FileNotFoundException e) {
        Snackbar.make(view, "File not found", Snackbar.LENGTH_SHORT).show();
        e.printStackTrace();
    } catch (IOException e) {
        Snackbar.make(view, "Error while saving image", Snackbar.LENGTH_SHORT).show();
        e.printStackTrace();
    }
}

答案 3 :(得分:0)

您应该使用Bitmap.CompressFormat.PNG或Bitmap.CompressFormat.WEBP。如果要获得较小尺寸的图像。您应该像我一样使用Bitmap.CompressFormat.WEBP。

enter image description here