当前位置: 首页 > news >正文

网站建设优化服务机构查关键词热度的网站

网站建设优化服务机构,查关键词热度的网站,宝安中心区房价,西安城乡住房建设厅网站首页前言在前面的博客中介绍了一款Java的海报生成器ImageCombiner,原文地址#xff1a;拿来就用的Java海报生成器ImageCombiner#xff08;一#xff09;#xff0c;在博文中简单介绍了一下代码以及一个真实的生成案例。但是对源码的介绍不多#xff0c;本文就针对源码进行深入…前言在前面的博客中介绍了一款Java的海报生成器ImageCombiner,原文地址拿来就用的Java海报生成器ImageCombiner一在博文中简单介绍了一下代码以及一个真实的生成案例。但是对源码的介绍不多本文就针对源码进行深入的讲解便于用户在使用的过程当中可以知其然知其所以然了解它的内部架构程序设计理念相关类的具体实现现有的不足再此基础上可以扩展出符合自己业务的逻辑进行二次开发改造。一、源码分析1、整体设计ImageCombiner的源码比较简洁主要包含以下三个包element 海报组合要素enums 海报样式、输出格式枚举painter 具体的绘制器。包图说明 整体类图2、绘制器设计从上面的类图可以清晰得看到兑现绘制器和绘制工厂共同完成图像、文本、矩形绘制器三种。图片绘制器与文本绘制器和矩形绘制器不一样的是多了两个make的方法一个是用于对图片进行高斯模糊处理的方法。高斯模糊的源码如下/*** 高斯模糊毛玻璃效果** param srcImage* param radius* return*/private BufferedImage makeBlur(BufferedImage srcImage, int radius) {if (radius 1) {return srcImage;}int w srcImage.getWidth();int h srcImage.getHeight();int[] pix new int[w * h];srcImage.getRGB(0, 0, w, h, pix, 0, w);int wm w - 1;int hm h - 1;int wh w * h;int div radius radius 1;int r[] new int[wh];int g[] new int[wh];int b[] new int[wh];int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;int vmin[] new int[Math.max(w, h)];int divsum (div 1) 1;divsum * divsum;int dv[] new int[256 * divsum];for (i 0; i 256 * divsum; i) {dv[i] (i / divsum);}yw yi 0;int[][] stack new int[div][3];int stackpointer;int stackstart;int[] sir;int rbs;int r1 radius 1;int routsum, goutsum, boutsum;int rinsum, ginsum, binsum;for (y 0; y h; y) {rinsum ginsum binsum routsum goutsum boutsum rsum gsum bsum 0;for (i -radius; i radius; i) {p pix[yi Math.min(wm, Math.max(i, 0))];sir stack[i radius];sir[0] (p 0xff0000) 16;sir[1] (p 0x00ff00) 8;sir[2] (p 0x0000ff);rbs r1 - Math.abs(i);rsum sir[0] * rbs;gsum sir[1] * rbs;bsum sir[2] * rbs;if (i 0) {rinsum sir[0];ginsum sir[1];binsum sir[2];} else {routsum sir[0];goutsum sir[1];boutsum sir[2];}}stackpointer radius;for (x 0; x w; x) {r[yi] dv[rsum];g[yi] dv[gsum];b[yi] dv[bsum];rsum - routsum;gsum - goutsum;bsum - boutsum;stackstart stackpointer - radius div;sir stack[stackstart % div];routsum - sir[0];goutsum - sir[1];boutsum - sir[2];if (y 0) {vmin[x] Math.min(x radius 1, wm);}p pix[yw vmin[x]];sir[0] (p 0xff0000) 16;sir[1] (p 0x00ff00) 8;sir[2] (p 0x0000ff);rinsum sir[0];ginsum sir[1];binsum sir[2];rsum rinsum;gsum ginsum;bsum binsum;stackpointer (stackpointer 1) % div;sir stack[(stackpointer) % div];routsum sir[0];goutsum sir[1];boutsum sir[2];rinsum - sir[0];ginsum - sir[1];binsum - sir[2];yi;}yw w;}for (x 0; x w; x) {rinsum ginsum binsum routsum goutsum boutsum rsum gsum bsum 0;yp -radius * w;for (i -radius; i radius; i) {yi Math.max(0, yp) x;sir stack[i radius];sir[0] r[yi];sir[1] g[yi];sir[2] b[yi];rbs r1 - Math.abs(i);rsum r[yi] * rbs;gsum g[yi] * rbs;bsum b[yi] * rbs;if (i 0) {rinsum sir[0];ginsum sir[1];binsum sir[2];} else {routsum sir[0];goutsum sir[1];boutsum sir[2];}if (i hm) {yp w;}}yi x;stackpointer radius;for (y 0; y h; y) {pix[yi] (0xff000000 pix[yi]) | (dv[rsum] 16) | (dv[gsum] 8) | dv[bsum];rsum - routsum;gsum - goutsum;bsum - boutsum;stackstart stackpointer - radius div;sir stack[stackstart % div];routsum - sir[0];goutsum - sir[1];boutsum - sir[2];if (x 0) {vmin[y] Math.min(y r1, hm) * w;}p x vmin[y];sir[0] r[p];sir[1] g[p];sir[2] b[p];rinsum sir[0];ginsum sir[1];binsum sir[2];rsum rinsum;gsum ginsum;bsum binsum;stackpointer (stackpointer 1) % div;sir stack[stackpointer];routsum sir[0];goutsum sir[1];boutsum sir[2];rinsum - sir[0];ginsum - sir[1];binsum - sir[2];yi w;}}srcImage.setRGB(0, 0, w, h, pix, 0, w);return srcImage;}在上述的代码尤其是绘制器工厂的实现信心的朋友通过阅读代码可以看到工厂实现方式还是可以进行改造由于目前的绘制对象也不多不是有代码洁癖的也能接受。package com.freewayso.image.combiner.painter;import com.freewayso.image.combiner.element.CombineElement; import com.freewayso.image.combiner.element.ImageElement; import com.freewayso.image.combiner.element.RectangleElement; import com.freewayso.image.combiner.element.TextElement;/*** Author zhaoqing.chen* Date 2020/8/21* Description*/ public class PainterFactory {private static ImagePainter imagePainter; //图片绘制器private static TextPainter textPainter; //文本绘制器private static RectanglePainter rectanglePainter; //矩形绘制器public static IPainter createInstance(CombineElement element) throws Exception {//考虑到性能这里用单件先不lock了if (element instanceof ImageElement) {if (imagePainter null) {imagePainter new ImagePainter();}return imagePainter;} else if (element instanceof TextElement) {if (textPainter null) {textPainter new TextPainter();}return textPainter;} else if (element instanceof RectangleElement) {if (rectanglePainter null) {rectanglePainter new RectanglePainter();}return rectanglePainter;} else {throw new Exception(不支持的Painter类型);}} }在上述的代码中通过if循环来进行具体的绘制图形实例生成可以想象一下针对上述的代码如果未来要扩展一种新的绘制对象该怎么进行代码优化。3、海报元素类设计海报元素可以分为三种元素与绘制器一一对应分别是图片元素、文本元素、矩形元素。这几个类都是CombineElement的子类。后面结合时序图来说明具体的元素绑定与注册及绘制过程。4、海报生成器ImageCombiner是最重要的海报生成器类在ImageCombiner中定义了一个海报元素类的集合用来保存需要在海报中添加的元素。同时定义了很多的以add开头的添加海报元素的方法用以往List集合中添加新的元素对象。/*** 添加图片元素** param imgUrl 图片rul* param x x坐标* param y y坐标* param width 宽度* param height 高度* param zoomMode 缩放模式* return*/public ImageElement addImageElement(String imgUrl, int x, int y, int width, int height, ZoomMode zoomMode) {ImageElement imageElement new ImageElement(imgUrl, x, y, width, height, zoomMode);this.combineElements.add(imageElement);return imageElement;}二、生成时序解析1、海报组装public void test1() throws Exception {try {String bgImageUrl https://img.thebeastshop.com/combine_image/funny_topic/resource/bg_3x4.png; //背景图测试url形式String qrCodeUrl http://imgtest.thebeastshop.com/file/combine_image/qrcodef3d132b46b474fe7a9cc6e76a511dfd5.jpg; //二维码String productImageUrl https://img.thebeastshop.com/combine_image/funny_topic/resource/product_3x4.png; //商品图BufferedImage waterMark ImageIO.read(new URL(https://img.thebeastshop.com/combine_image/funny_topic/resource/water_mark.png)); //水印图测试BufferedImage形式BufferedImage avatar ImageIO.read(new URL(https://img.thebeastshop.com/member/privilege/level-icon/level-three.jpg)); //头像String title # 最爱的家居; //标题文本String content 苏格拉底说“如果没有那个桌子可能就没有那个水壶”; //内容文本//合成器和背景图整个图片的宽高和相关计算依赖于背景图所以背景图的大小是个基准ImageCombiner combiner new ImageCombiner(bgImageUrl, OutputFormat.PNG);combiner.setBackgroundBlur(30); //设置背景高斯模糊毛玻璃效果combiner.setCanvasRoundCorner(100); //设置整图圆角输出格式必须为PNG//商品图设置坐标、宽高和缩放模式若按宽度缩放则高度按比例自动计算combiner.addImageElement(productImageUrl, 0, 160, 837, 0, ZoomMode.Width).setRoundCorner(46) //设置圆角.setCenter(true); //居中绘制会忽略x坐标参数改为自动计算//标题默认字体为“阿里巴巴普惠体”也可以自己指定字体名称或Font对象combiner.addTextElement(title, 55, 150, 1400);//内容设置文本自动换行需要指定最大宽度超出则换行、最大行数超出则丢弃、行高combiner.addTextElement(content, 微软雅黑, 40, 150, 1480).setAutoBreakLine(837, 2, 60);//头像圆角设置一定的大小可以把头像变成圆的combiner.addImageElement(avatar, 200, 1200, 130, 130, ZoomMode.WidthHeight).setRoundCorner(200).setBlur(5); //高斯模糊毛玻璃效果//水印设置透明度0.0~1.0combiner.addImageElement(waterMark, 630, 1200).setAlpha(.8f) //透明度0.0~1.0.setRotate(15); //旋转0~360按中心点旋转//二维码强制按指定宽度、高度缩放combiner.addImageElement(qrCodeUrl, 138, 1707, 186, 186, ZoomMode.WidthHeight);//元素对象也可以直接new然后手动加入待绘制列表TextElement textPrice new TextElement(1290, 40, 600, 1400);textPrice.setStrikeThrough(true); //删除线combiner.addElement(textPrice); //加入待绘制集合//动态计算位置int offsetPrice textPrice.getX() textPrice.getWidth() 10;combiner.addTextElement(999, 60, offsetPrice, 1400).setColor(Color.red);//执行图片合并combiner.combine();//保存文件combiner.save(d://fullTest.png);System.out.println(1/0);System.out.println(end...);//或者获取流并上传oss等//InputStream is combiner.getCombinedImageStream();//String url ossUtil.upload(is);} catch (Exception e) {e.printStackTrace();}}通过以上的时序图可以清晰的看到系统的调用过程一共包含了24个步骤。通过时序图和代码相信您可以很直观的看到相关的调用方式这里不做过多的赘述。2、combine海报合成/*** 合成图片返回图片对象** throws Exception*/public BufferedImage combine() throws Exception {combinedImage new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g combinedImage.createGraphics();//PNG要做透明度处理否则背景图透明部分会变黑if (outputFormat OutputFormat.PNG) {combinedImage g.getDeviceConfiguration().createCompatibleImage(canvasWidth, canvasHeight, Transparency.TRANSLUCENT);g combinedImage.createGraphics();}//抗锯齿g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g.setColor(Color.white);//循环绘制各元素for (CombineElement element : combineElements) {IPainter painter PainterFactory.createInstance(element);if (element.isRepeat()) {//平铺绘制painter.drawRepeat(g, element, canvasWidth, canvasHeight);} else {//正常绘制painter.draw(g, element, canvasWidth);}}g.dispose();//处理整图圆角if (roundCorner ! null) {combinedImage this.makeRoundCorner(combinedImage, canvasWidth, canvasHeight, roundCorner);}return combinedImage;} combine方法是最核心的生成方法在第6步进入循环将页面设置的不同的海报元素添加到生成器中并调用绘制器工程生成相应的绘制器通过Graphics2D来进行海报的生成。至此海报生成器的相关类就全部讲解完毕工具虽小五脏俱全。//循环绘制各元素 for (CombineElement element : combineElements) {IPainter painter PainterFactory.createInstance(element);if (element.isRepeat()) {//平铺绘制painter.drawRepeat(g, element, canvasWidth, canvasHeight);} else {//正常绘制painter.draw(g, element, canvasWidth);}}三、总结以上就是本文的主要内容本文主要从海报生成器的源码和生成时序解析两个方面进行深度解析使用UML的分析方法对类图、时序图结合源码进行说明将海报生成器的核心代码做完整的剖析想研究的朋友可以深入的学习对于源码中不合理的地方可以进行修改。
http://www.ho-use.cn/article/10813901.html

相关文章:

  • 九江建企业网站做一份seo网站诊断
  • 女人和男人做床上爱网站国内wordpress空间
  • 旅游网站手机模板网站公司怎么做的好
  • 海南建设银行官网招聘网站企业营业执照查询系统入口
  • 做网站编辑的感受后台登陆wordpress
  • 温州网站开发定制网站建设首期款
  • 一个外国人做汉字网站网站建设做得好的公司
  • 微网站开发需要多少费用深圳企业宣传片制作
  • 邯郸网站建设的企业外贸网站建设视频
  • 在门户网站建设上的讲话临平做网站
  • 大连个人网站建设wordpress文章导入公众号
  • 天津网站建设基本流程加强网站信息内容建设管理
  • 优秀的网页设计网站app大全视频app大全
  • 怎么制作网站设计wordpress 文章新窗口
  • 什么是企业营销型网站做防护信息的网站
  • jquery在网站开发实例运用建网站网站
  • 深圳市宝安区建设局网站搜索引擎优化是什么工作
  • 怎样把建好的网站上传到互联网营销型网站的付费推广渠道
  • 建设银行的官方网站电话小公司管理软件
  • 空气源热泵热水器网站建设网站建设多少钱一年
  • 陕西建设网网站集群专业网站搭建运营
  • 美食网站建设的时间进度表南京做网站公司地点
  • 郑州网站优化工资网站建设易网宣
  • 交流做病理切片的网站哪个网站可以接任务做兼职
  • 如何设计网站首页导航专业行业网站开发报价
  • 制作网站能挣钱jsp网站 值班
  • 怎么做优惠网站建筑模拟3正版下载
  • 城乡建设厅建筑特种作业证书查询seo外链专员工作要求
  • 湛江宇锋网站建设linux网站如何做ip解析
  • 湖南建设银行官网网站首页vue开发视频网站