用JAVA awt实现Image Asset Studio生成圆形或圆角矩形图片功能

背景

随着Android 7.1推出Round Icon Resources功能(不了解的,可以看Android开发者官网这篇文章Android 7.1 for Developers),圆形Icon应该会是将来手机的标配,刚刚推出的Android O Preview版本进一步证实的这一观点。尽管Image Asset Studio为我们制作ICON提供了丰富的功能,但对于一个没有美工基础特别是个人开发者来说制作一个稍微好看一点的ICON还是有一定难度的。本文旨在为这些开发者提供一个从本地图片或者网络图片直接制作ICON的工具。同时也可以对Image Asset Studio工具的原理有一定的了解。

用Java awt操作图片

  • 从流创建BufferedImage
BufferedImage image=ImageIO.read(inputStream);
  • 把BufferedImage写入到文件或输出流
 ImageIO.write(outputImage, "png", new File(targetPath));
  • 缩放图片
static BufferedImage scaleImage(BufferedImage image, int targetSize) {
    AffineTransform affineTransform = new AffineTransform();
    affineTransform.setToScale(targetSize * 1f / image.getWidth(), targetSize * 1f / image.getHeight());
    AffineTransformOp affineTransformOp = new AffineTransformOp(affineTransform, null);
    BufferedImage outputImage = new BufferedImage(targetSize, targetSize, BufferedImage.TYPE_INT_ARGB);
    affineTransformOp.filter(image, outputImage);
    return outputImage;
}
  • 裁切图片
static BufferedImage cropImage(BufferedImage image, TransformParams params, int targetSize) {
        ImageFilter cropFilter = new CropImageFilter(params.mCropAtX, params.mCropAtY, targetSize, targetSize);
        Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
        BufferedImage outputImage = new BufferedImage(targetSize, targetSize, BufferedImage.TYPE_INT_ARGB);
        Graphics g = outputImage.getGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();
        return outputImage;
    }
  • 圆角矩形
static BufferedImage roundImage(BufferedImage image, int targetSize, int cornerRadius) {
        BufferedImage outputImage = new BufferedImage(targetSize, targetSize, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = outputImage.createGraphics();
        g2.setComposite(AlphaComposite.Src);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(Color.WHITE);
        g2.fill(new RoundRectangle2D.Float(0, 0, targetSize, targetSize, cornerRadius, cornerRadius));
        g2.setComposite(AlphaComposite.SrcAtop);
        g2.drawImage(image, 0, 0, null);
        g2.dispose();
        return outputImage;
    }
  • 带阴影的圆形图片
static BufferedImage circleImage(BufferedImage image, int targetSize) {
        try {
            BufferedImage shadowImage = ImageIO.read(Icon.class.getResourceAsStream(
                    "/resource/shadow.png"));
            BufferedImage backGroundImage = ImageIO.read(Icon.class.getResourceAsStream(
                    "/resource/white.png"));
            BufferedImage newImage = scaleImage(image, 90);
            int width = newImage.getWidth();
            int height = newImage.getHeight();
            int[] backGroundPixArray = getPixArray(backGroundImage);
            int[] currentPixArray = getPixArray(newImage);
            int[] resultArray = convertImage(currentPixArray, backGroundPixArray, width, height);
            Image pic = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(width,height,resultArray, 0, width));
            Graphics2D tmp = shadowImage.createGraphics();
            tmp.drawImage(backGroundImage, 0, 0, null);
            tmp.drawImage(pic, 5, 0, null);
            tmp.dispose();

            return scaleImage(shadowImage,targetSize);
        } catch (IOException ex) {
            System.out.println("error");
        }
        return null;
    }

这里简单说下带阴影的圆形图片的实现原理:用两个模板文件,一个是圆形的,另一个是用于制作阴影。圆形模板与输入图片做“与”操作,这样就制作成了1个圆形图片;然后再把这个圆形图片渲染到阴影图片上,输出的图片就是带有阴影的圆形图片。其实制作圆形图片没毕业这样复杂,用上述制作圆角矩形图片的功能就可以实现,这里更多的目的是研究Image Asset Studio的实现原理。而且用模板方法还有一个缺点:就是受限于模板文件的样式,如上述的圆形模板文件/resource/white.png中圆形的直径是90px,因此我必须先把输入图片缩小到90px,然后再做“与”操作。

命令行工具使用

工具源码可以从github RoundIcon下载,下载后:

  • 先生成JAR包
    用gradle命令生成RoundIcon.jar
gradlew.bat jar
  • 生成图片
java -jar RoundIcon.jar <输入图片地址> [输出ICON地址] [输出ICON大小] [圆角大小] [裁切模式]

工具命令有5个参数:
输入图片地址:这个参数是必须的,可以是本地图片文件,或者网络图片网址
输出ICON地址:这个参数是可选的,用于指定输出icon文件的路径,默认是当前目录下icon.png
输出ICON大小:这个参数是可选,用于指定输出icon的大小,默认是96
圆角大小:这个参数是可选,用于指定输出icon的圆角大小;默认是0,即生成带阴影的圆形ICON;大于0表示圆角矩形ICON的圆角大小,当圆角大小等于输出ICON大小时候输出的也是圆形icon,只是不带阴影;这个值一般是在[0,输出ICON大小]范围内,程序没有对该值做严谨的限制校验。
裁切模式:这个参数是可选,用于指定对图片预处理时缩放、裁切模式。可以是1,2,3或者其他整形数值。1,2或者3表示先把输入图片按【最小边/输出ICON大小】的等比缩放,然后在裁切;其中1表示从顶部/左边裁切,2表示从中间裁切,3表示从底部/右边裁切。其他整形数值表示把输入图片不等比缩放至输出ICON大小。


以这个图片作为输入图片

圆角大小为0时候,输出如下:

圆角大小为20时候,裁切模式 0,输出如下:

圆角大小为20时候,裁切模式 1,输出如下:

圆角大小为20时候,裁切模式 2,输出如下:

圆角大小为20时候,裁切模式 3,输出如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值