Android中的小插图

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显示的方法生成的.

左:来自php/ImageMagick的小插图. 右:来自Android的晕影使用上面显示的方法

Tar*_*nfx 4

如果仔细观察左图,会发现 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