gre*_*ghz 8 android image-processing
所以这就是我在Android中的小插图样式效果(图像是一个位图):
public void vignette() {
float radius = (float) (image.getWidth()/1.5);
RadialGradient gradient = new RadialGradient(image.getWidth()/2, image.getHeight()/2, radius, Color.TRANSPARENT, Color.BLACK, Shader.TileMode.CLAMP);
Canvas canvas = new Canvas(image);
canvas.drawARGB(1, 0, 0, 0);
final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setShader(gradient);
final Rect rect = new Rect(0, 0, image.getWidth(), image.getHeight());
final RectF rectf = new RectF(rect);
canvas.drawRect(rectf, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(image, rect, rect, paint);
}
Run Code Online (Sandbox Code Playgroud)
这"有效"但存在一些问题.首先,这不是一个真正的小插图,它只是一个渐变,所以你可以看到黑色的几乎一直到中心,而不是靠近边缘羽化.
RadialGradient也只允许设置圆的半径而不是椭圆.椭圆将能够更有效地匹配非方形图像的尺寸而不是圆形.
渐变的质量也不是很好.
我正在尝试从ImageMagick复制vignetteImage方法(我特指的是php版本).我在PHP中使用此代码生成我想要的图像样式:
$im = new IMagick('city.png');
$im->vignetteImage($width/1.5, 350, 20, 20);
Run Code Online (Sandbox Code Playgroud)
我尝试使用NDK构建ImageMagick但是在正确链接各种图像库方面没有成功(我只使用gif支持成功构建但没有png,jpeg或tiff).
我还附上了一张图片,比较了上面显示的两种方法.左边的图像是通过php使用ImageMagick生成的,右边的图像是使用上面针对Android显示的方法生成的.

如果仔细观察左图,会发现 tf 使用 Alpha(透明度)指数增长,而右图则呈线性增长。
显然Shader.TitleMode.CLAMP是一个线性函数。你应该做的是使用RadialGradient(float x, float y, float radius, int[] Colors, float[] Positions, Shader.TileModetile)在图像上定义 10 个或更多点,其颜色值呈指数递减(黑色到透明的)。
或者,您可以参考ICS画廊的画廊3D源http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.1_r1/com/android/gallery3d /photoeditor/filters/VignetteFilter.java?av=h
| 归档时间: |
|
| 查看次数: |
3810 次 |
| 最近记录: |