首页>>后端>>java->Java实现Gif图转字符动图

Java实现Gif图转字符动图

时间:2023-12-02 本站 点击:0

前面介绍了两篇基于jdk实现图片灰度处理、转字符图片的操作,接下来我们在将之前的能力扩展一下,支持将一个gif图灰度化或者转gif字符图

本文的实现主要在前面两篇文章的基础上来实现,推荐没有看过的小伙伴也可以瞅一眼

Java实现图片灰度化

Java实现图片转字符图片示例demo

单张图的灰度化与转字符实现之后,gif图的实现就简单多了;gif图无非是多张图组合而成,将每一张图转换之后,再重新组装成gif图就完事了

这里我们使用的gif工具类来自于https://github.com/liuyueyi/quick-media/tree/master/plugins/base-plugin/src/main/java/com/github/hui/quick/plugin/base/gif

核心关键类为GifEncodeGifDecode;借助它来实现gif图的加载与保存

首先我们将上篇博文中的转字符图的方法抽取一下

ColorgetAverage(BufferedImageimage,intx,inty,intw,inth){intred=0;intgreen=0;intblue=0;intsize=0;for(inti=y;(i<h+y)&&(i<image.getHeight());i++){for(intj=x;(j<w+x)&&(j<image.getWidth());j++){intcolor=image.getRGB(j,i);red+=((color&0xff0000)>>16);green+=((color&0xff00)>>8);blue+=(color&0x0000ff);++size;}}red=Math.round(red/(float)size);green=Math.round(green/(float)size);blue=Math.round(blue/(float)size);returnnewColor(red,green,blue);}privateBufferedImageparseImg(BufferedImageimg){intw=img.getWidth(),h=img.getHeight();//创建新的灰度图片画板BufferedImageout=newBufferedImage(w,h,img.getType());Graphics2Dg2d=out.createGraphics();g2d.setColor(null);g2d.fillRect(0,0,w,h);intsize=12;Fontfont=newFont("宋体",Font.BOLD,size);g2d.setFont(font);for(intx=0;x<w;x+=size){for(inty=0;y<h;y+=size){ColoravgColor=getAverage(img,x,y,size,size);g2d.setColor(avgColor);g2d.drawString("灰",x,y);}}g2d.dispose();returnout;}

接着就是Gif的操作了

@TestpublicvoidtestRender()throwsIOException{Stringfile="https://c-ssl.duitang.com/uploads/item/201707/11/20170711194634_nTiK5.thumb.1000_0.gif";//从网络上下载图片GifDecoderdecoder=newGifDecoder();decoder.read(FileReadUtil.getStreamByFileName(file));//这里是核心的转换逻辑List<ImmutablePair<BufferedImage,Integer>>frames=newArrayList<>();for(inti=0;i<decoder.getFrameCount();i++){BufferedImageimg=decoder.getFrame(i);frames.add(ImmutablePair.of(parseImg(img),decoder.getDelay(i)));}//下面是保存gif图Filesave=newFile("/tmp/out2.gif");ByteArrayOutputStreamoutputStream=newByteArrayOutputStream();GifHelper.saveGif(frames,outputStream);FileOutputStreamout=newFileOutputStream(save);out.write(outputStream.toByteArray());out.flush();out.close();System.out.printf("渲染完成");}

上图转换成功之后,输出如下

如果希望输出图片更像原图,可以修改上面的fontSize,比如上面用的是12,可以调整成8,6等值,根据实际情况进行选择

有的小伙伴可能会说了,动漫的gif图转换之后相似度还可以,那么真实人物图转换之后呢?

接下来我们借助开源项目 https://github.com/liuyueyi/quick-media 来迅速的实现一个gif图转换

下图来自网络,有兴趣的自己打开查看,就不贴上了?) http://n.sinaimg.cn/sinacn/w390h219/20171231/0ac1-fyqefvw5238474.gif

@TestpublicvoidtestGif()throwsException{Stringimg="http://n.sinaimg.cn/sinacn/w390h219/20171231/0ac1-fyqefvw5238474.gif";ImgPixelWrapper.build().setSourceImg(img).setBlockSize(7).setPixelType(PixelStyleEnum.CHAR_COLOR)//生成的gif图放大为原来的两倍.setRate(2d)//支持设置字体.setFontStyle(Font.BOLD)//这里设置生成字符图中的字符集.setChars("灰").build().asFile(prefix+"/out3.gif");System.out.println("--------");}

最后提个小问题,gif图都能生成字符图了,那么视频也可以生成字符视频么?

公众号:一灰灰blog


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/10465.html