我正在开发在 Canvas 上绘图的应用程序,类似于 Android SDK 中的 Finger Paint 演示。我的问题是当我使用时PorterDuff.Mode.CLEAR
。当绘图和画布时,如果我尝试擦除某些内容,它工作正常。但如果我尝试将图像另存为PNG
文件中橡皮擦的笔画是黑色的,我不知道为什么会发生这种情况。这是我正在做的一个例子:
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
Eraser :
case ERASE_MENU_ID:
mPaint.setXfermode(new PorterDuffXfermode(
PorterDuff.Mode.CLEAR));
return true;
以及我如何保存图像:
Calendar currentDate = Calendar.getInstance();
SimpleDateFormat formatter= new SimpleDateFormat("yyyyMMMddHmmss");
String dateNow = formatter.format(currentDate.getTime());
File dir = new File(mImagePath);
if(!dir.exists())
dir.mkdirs();
File file = new File(mImagePath + "/" + dateNow +".png");
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
Toast.makeText(getApplicationContext(), "File saved at \n"+mImagePath + "/" + dateNow +".png", Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
Log.e("Panel", "FileNotFoundException", e);
}
catch (IOException e) {
Log.e("Panel", "IOEception", e);
}
return true;
这是图像的示例:
这是保存之前我的画布的样子:
这是将其保存到 SD 卡后的图像:
Fingerpaint 代码的问题在于您看到的内容与压缩到 png 中的内容不同。看看onDraw()。首先,将屏幕绘制为白色。然后添加位图。因为您使用了 Porter Duff Clear,位图的已擦除部分实际上包含透明黑色像素(值 0x00000000)。但因为你有这些白色背景black像素显示为白色。
要解决此问题,请更改保存代码以执行与绘制代码相同的操作
try {
fos = new FileOutputStream(file);
Bitmap saveBitmap = Bitmap.createBitmap(mBitmap);
Canvas c = new Canvas(saveBitmap);
c.drawColor(0xFFFFFFFF);
c.drawBitmap(mBitmap,0,0,null);
saveBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
saveBitmap.recycle();
...
或者不使用 PortDuff.Clear:
case ERASE_MENU_ID:
mPaint.setColor(Color.WHITE);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)