前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >100 行 Java 代码实现一个表情包生成器!

100 行 Java 代码实现一个表情包生成器!

作者头像
业余草
发布2020-12-07 15:10:59
8310
发布2020-12-07 15:10:59
举报
文章被收录于专栏:业余草业余草

你知道的越多,不知道的就越多,业余的像一棵小草!

你来,我们一起精进!你不来,我和你的竞争对手一起精进!

编辑:业余草

blog.csdn.net/xiaojimanman/article/details/18556703

推荐:https://www.xttblog.com/?p=5120

在同学群里,每次她们聊天都能带上炫酷的表情,我百思不得其解她们是从哪里获得的这些表情。最后通过一番沟通得知,她们使用的是讯飞输入法。作为一个程序员,我咽不下这口气,我得自己实现一个表情自动生成器,于是就自己动手做了一个 demo,没想到还真给搞定了~

目前,可以处理“臣妾真的做不到啊”、“妈妈再打我一次”、“王宝强泰囧三张图片”,如想处理其他图片,在类 cn.lulei.util.img.ImgParams 、前台index.html 和 index.js 两个文件做相应的配置即可实现。

具体效果如下:

整体项目结构如下图所示

其他的实现都很简单,自己也不在做详细的介绍,参照源代码即可,整个项目的难点主要在图像的处理过程,因此做了一个图片处理类 ImgDeal 来实现图像的绘制,相关源码如下:

代码语言:javascript
复制
package cn.lulei.util.img;   import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList; import javax.imageio.ImageIO; import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGEncodeParam;import com.sun.image.codec.jpeg.JPEGImageEncoder;  public class ImgDeal {  private final static int FONTSIZE = 24;    /**   * @param filePath   * @param outStream   * @param characters   * @param heights   * @param c   * @throws IOException   * @Date: 2014-1-20     * @Author: lulei     * @Description: 绘制图片   */  public static void drawImg(String filePath, OutputStream outStream, ArrayList<String> characters, ArrayList<Integer> heights, Color c) throws IOException {    //参数不对,直接返回    if(characters == null || heights == null || characters.size() != heights.size()){      return;    }    File file = new File(filePath);    //文件不存在,直接返回    if (!file.exists()) {      return;    }    Image img = ImageIO.read(file);    int[] wh = getImgWH(img);    BufferedImage bufferedImage = new BufferedImage(wh[0], wh[1], BufferedImage.TYPE_INT_RGB);    Graphics2D g = bufferedImage.createGraphics();    g.drawImage(img.getScaledInstance(wh[0], wh[1], Image.SCALE_SMOOTH), 0, 0, null);    g.setColor(c);    int i = 0;    //图片上输入文字    for (String character : characters){      int[] fl = getFsLs(wh[0], getLength(character, 0));      g.setFont(new Font("楷体", Font.BOLD, fl[1]));      g.drawString(character, fl[0], heights.get(i++));    }    //将图片输入到输出流中    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);    JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);    param.setQuality(1.0F, false);    encoder.setJPEGEncodeParam(param);    encoder.encode(bufferedImage);  }    /**   * @param question   * @param defaultInt   * @return   * @Date: 2014-1-20     * @Author: lulei     * @Description: 计算字符长度   */  private static int getLength(String question, int defaultInt){    int re = 0;    if (question != null){      int count = question.length();      for(int i = 0; i < count; i++) {        if (question.charAt(i) < 255) {          re += 5;        } else {          re += 9;        }      }    }    re /= 9;    return re == 0 ? defaultInt : re;  }    /**   * @param img   * @return   * @Date: 2014-1-20     * @Author: lulei     * @Description: 获取图片的长宽   */  private static int[] getImgWH(Image img){    int[] wh = new int[2];    wh[0] = img.getWidth(null);    wh[1] = img.getHeight(null);    return wh;  }    /**   * @param width   * @param length   * @return   * @Date: 2014-1-20     * @Author: lulei     * @Description: 计算生成文字的宽度的起始位置和字体大小   */  private static int[] getFsLs(int width, int length) {    int[] fl = new int[2];    if (length * FONTSIZE < width) {      fl[0] = (width - (length * FONTSIZE)) / 2;      fl[1] = FONTSIZE;    } else {      fl[0] = 5;      fl[1] = width / length - 1;    }    return fl;  }}

整个实现还是很简单的,感兴趣的网友可以自己加一些美图,实现一些更玄的功能!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 你知道的越多,不知道的就越多,业余的像一棵小草!
  • 编辑:业余草
  • blog.csdn.net/xiaojimanman/article/details/18556703
  • 推荐:https://www.xttblog.com/?p=5120
相关产品与服务
图片处理
图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档