android - 从图像中绘制轮廓
问题描述
我想通过在背景中绘制并扩展第二张图片来在图片周围绘制轮廓,但我不是很成功,我怎样才能画出规则的笔触?
我画的轮廓:
我要绘制的轮廓:
我的代码;
private Bitmap ContourBitmap() {
int strokeWidth = 8;
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.flower_icon);
Bitmap newStrokedBitmap = Bitmap.createBitmap(originalBitmap.getWidth() + 2 * strokeWidth,
originalBitmap.getHeight() + 2 * strokeWidth, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(newStrokedBitmap);
float scaleX = (originalBitmap.getWidth() + 2.0f * strokeWidth) / originalBitmap.getWidth();
float scaleY = (originalBitmap.getHeight() + 2.0f * strokeWidth) / originalBitmap.getHeight();
Matrix matrix = new Matrix();
matrix.setScale(scaleX, scaleY);
canvas.drawBitmap(originalBitmap, matrix, null);
canvas.drawColor(Color.WHITE, PorterDuff.Mode.SRC_ATOP); //Color.WHITE is stroke color
canvas.drawBitmap(originalBitmap, strokeWidth, strokeWidth, null);
}
解决方案
我认为你在正确的轨道上......
这是一个策略,而不是缩放只是每次稍微偏移几次绘制相同的原始图片,请参见下面的示例:
var canvas = document.getElementById('canvas')
var ctx = canvas.getContext('2d')
var img = new Image;
img.onload = draw;
img.src = "http://i.stack.imgur.com/UFBxY.png";
var s = 10, // thickness scale
x = 15, // final position
y = 15;
function draw() {
ctx.globalAlpha = 0.2
ctx.filter = 'brightness(0%)'
for (i = 0; i < 360; i++)
ctx.drawImage(img, x + Math.sin(i) * s, y + Math.cos(i) * s);
ctx.globalAlpha = 1
ctx.filter = 'none'
ctx.drawImage(img, x, y);
}
<canvas id=canvas width=350 height=600></canvas>
我申请了一个filter = 'brightness(0%)'
,但你可以申请更多:
https ://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/filter
我正在使用 HTML 画布,但同样的想法应该很好地“翻译”到 android 画布上。
推荐阅读
- reactjs - 反应 - Laravel API CORS
- angular - 显示图像时出现不安全的 URL 错误
- python - 无法在我的 jupyter 笔记本上使用 !wget
- r - 如何根据两个矩阵的比较来更新 R 中的矩阵值?
- python - 为什么这个列表的价值会发生变化?我不想改变它
- node.js - 如何在实时服务器上部署我的应用程序时修复 405 方法不允许错误
- python - 如何使 tkinter 框架填充整个画布并与它一起扩展?
- mysql - 如何计算基于 3 个表的 SQL
- apache-flink - 为什么没有调用全局窗口自定义触发器中的 clear 方法?
- ios - 如何使用 ios 模拟器模拟电源状态的更改