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

本教程将介绍位图在保存时会失去透明度的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

位图在保存时会失去透明度 教程 第1张

问题描述

尝试将位图保存到外部图片目录时出现问题。当我使用Bitmap.compress函数保存它时,位图失去了透明度并使背景变黑。但是,当我将位图传递给一个图像视图并在活动中显示它时,它看起来很好,而且是透明的。仅当我尝试保存时,透明度才会变为黑色。

我不得不说,我使用两个位图和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();
  }

图片仅显示在路径中,包围框的睡觉为黑色,不透明。
感谢您的帮助。

推荐答案

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

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

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

好了关于位图在保存时会失去透明度的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。