【发布时间】:2018-11-23 00:32:22
【问题描述】:
我正在尝试使用 Picasso Transformation 在带有松鼠面具的图像上绘制边框。松鼠面具是一个 VectorDrawable。
我认为最简单和最灵活的方法是首先使用canvas.drawPaint 绘制一个具有所需边框颜色的较大松鼠。然后使用canvas.drawBitmap 使用照片位图绘制一个较小的松鼠。我可以分别绘制它们,我可以缩放位图并成功地用蒙版绘制它,但是任何时候我尝试将两者结合起来都会在canvas.drawBitmap 调用中丢失蒙版。关于我可能做错的任何想法?
我尝试了很多混合模式选项,但我认为这不是问题。
override fun transform(source: Bitmap): Bitmap {
val width = source.width
val height = source.height
val borderWidth = 100
val output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(output)
//Draw a full size, red squircle
val paint = Paint()
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
paint.color = Color.RED
val mask = context.getDrawable(maskID)
mask.setBounds(0, 0, width, height)
mask.draw(canvas)
canvas.drawPaint(paint)
//Draw a masked, scaled down bitmap of the photo on top
val bitmapPaint = Paint()
bitmapPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
val bitmapMask = context.getDrawable(maskID)
bitmapMask.setBounds(borderWidth / 2, borderWidth / 2, width - borderWidth / 2, height - borderWidth / 2)
bitmapMask.draw(canvas)
val sourceDrawable = source.toDrawable(context.resources)
sourceDrawable.setBounds(borderWidth / 2, borderWidth / 2, width - borderWidth / 2, height - borderWidth / 2)
canvas.drawBitmap(sourceDrawable.bitmap, null,
Rect(borderWidth / 2, borderWidth / 2, width - borderWidth / 2, height - borderWidth / 2),
bitmapPaint)
source.recycle()
return output
}
结果:
如果我注释掉对drawBitmap 的调用,我会得到这个结果(几乎就在那里!):
【问题讨论】:
-
我想你最终会画 3 次。首先是外部区域,然后是带有掩码的图像。
标签: android kotlin android-canvas picasso android-image