zoukankan      html  css  js  c++  java
  • 工作总结02(海报上传模块)

    1.海报显示的速度比较慢。

    原因:图片过大。

    解决:在数据库中增加字段,存压缩后的图片。在上传图片的时候,对图片进行压缩处理,存两份,一份原图,一份压缩图。

    显示图片列表的时候查询压缩图,查看详情的时候,去查原图。

    压缩图片的工具类:

    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Iterator;
    
    import javax.imageio.IIOImage;
    import javax.imageio.ImageIO;
    import javax.imageio.ImageWriteParam;
    import javax.imageio.ImageWriter;
    
    /**
     * 
     * @ClassName: ImageBiz
     * @Description:压缩图片方法
     */
    public class ImageBizUtil {
        /**
         * 
         * @Title: imageZip
         * @Description: 根据分辨率压缩图片
         * @param oldByte 源图片字节
         * @param width 压缩图片的宽
         * @param height 压缩图片的高
         * @return
         * @throws IOException
         * @return: byte[]
         * @throws
         */
        public static byte[] imageZip(byte[] oldByte, int width, int height) throws IOException {
            ByteArrayOutputStream os = null;
            InputStream inputStream = null;
            try {
                inputStream = new ByteArrayInputStream(oldByte);
                // 用系统缓存
                ImageIO.setUseCache(false);
                // 或者设定一个缓存路径
                // ImageIO.setCacheDirectory(File cacheDirectory);
                BufferedImage image = ImageIO.read(inputStream);
    
                // 为等比缩放计算输出的图片宽度及高度
                int imageWidth = image.getWidth(null);
                int imageHeight = image.getHeight(null);
                float ratio = getRatio(imageWidth, imageHeight, width, height);
                int newWidth = (int) (ratio * imageWidth);
                int newHeight = (int) (ratio * imageHeight);
    
                BufferedImage newBufferedImage =
                        new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);
                newBufferedImage.getGraphics().drawImage(
                        image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
                Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg");
                ImageWriter imageWriter = iter.next();
                ImageWriteParam iwp = imageWriter.getDefaultWriteParam();
                iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                os = new ByteArrayOutputStream(oldByte.length);
                imageWriter.setOutput(ImageIO.createImageOutputStream(os));
                IIOImage iio_image = new IIOImage(newBufferedImage, null, null);
                imageWriter.write(null, iio_image, iwp);
                os.flush();
                byte[] newBytes = os.toByteArray();
                return newBytes;
            } catch (IOException e) {
                throw e;
            } finally {
                if (os != null) {
                    os.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            }
        }
    
        /**
         * 
         * @Title: getRatio
         * @Description: 压缩比例算法
         * @param imageWidth 原图片宽
         * @param imageHeight 原图片高
         * @param width 压缩后的图片宽
         * @param height 压缩后的图片高
         * @return
         * @return: float
         */
        public static float getRatio(int imageWidth, int imageHeight, int width, int height) {
            float Ratio = 1.0f;
            float widthRatio = (float) width / imageWidth;
            float heightRatio = (float) height / imageHeight;
            if (widthRatio < 1.0 || heightRatio < 1.0) {
                Ratio = widthRatio <= heightRatio ? widthRatio : heightRatio;
            }
            return Ratio;
        }
    }

    核心代码:

    //海报上传
      public BaseResult uploadPosterInfomation(List<GoPhosterInfomationPo> list){
        
        //创建返参对象
        BaseResult baseResult = new BaseResult();
        
        
        for (int i = 0; i < list.size(); i++) {
          
          if (StringUtils.isBlank(list.get(i).getTypeCode())) {
            baseResult.setRet(BaseResult.BIZ_ERROR);
            baseResult.setMsg("请录入海报类型");
            return baseResult;
          }
          
          if (StringUtils.isBlank(list.get(i).getPhosterImage())) {
            baseResult.setRet(BaseResult.BIZ_ERROR);
            baseResult.setMsg("请选择要保存的海报模板");
            return baseResult;
          }
          
          //设置海报唯一标识
          list.get(i).setPhosterId(UUIDUtil.genUUID2());
          
          //设置海报序号
          Integer maxNum = posterMakeFunctionMapper.queryMaxNum();
          if (maxNum == null || maxNum == 0) {
            list.get(i).setOrderNumber(1);
          }else{
            list.get(i).setOrderNumber(maxNum+1);
          }
      
          //将base64图片转为二进制
          byte[] imgByt = ImageUtil.getImageByte(list.get(i).getPhosterImage());
          byte[] imgZip = null;//压缩之后的图片
          try {
              imgZip = ImageBizUtil.imageZip(imgByt, 200, 200);
          } catch (IOException e) {
              e.printStackTrace();
          }
          String imgStr = ImageUtil.getImageStr(imgZip);
         
          list.get(i).setPhosterImageZip("data:image/png;base64,"+imgStr);
          
          //保存海报
          posterMakeFunctionMapper.uploadPosterInfomation(list.get(i));
          
        }

    2.在制作海报的时候,设置微软雅黑字体,在本地测试,生成的海报上的字体是微软雅黑,但是在服务器上却显示宋体。

    原因:服务器没有微软雅黑字体。

    解决:

    01.在服务器上安装微软雅黑字体

    1.到windows环境下找到微软雅黑字体库,C:WindowsFonts。msyf.ttf(微软雅黑))
    2.到linux环境下创建目录
    mkdir -pv /usr/share/fonts/chinese/TrueType
    使用rz命令,将字体放入目录下rz 
    cd /usr/share/fonts/chinese/TrueType
    chmod 755 * 为字体赋予可执行权限
    3.建立字体缓存
    # mkfontscale (如果提示 mkfontscale: command not found,需自行安装 # yum install mkfontscale )
    # mkfontdir
    # fc-cache -fv (如果提示 fc-cache: command not found,则需要安装# yum install fontconfig )
    4.reboot重启系统

    02.将微软雅黑字体文件放在项目中

     001.将字体文件放到项目中

    002.根据项目中的字体文件获取字体Font的工具类。

    package cn.picclife.mwx.salesupport.phoster.service.impl;
    
    import java.awt.Font;
    import java.awt.FontFormatException;
    import java.io.File;
    import java.io.IOException;
    
    import cn.picclife.mwx.salesupport.marketactivity.util.ParsePDFUtil;
    
    /**
     * 
    * @ClassName: FontUtil 
    * @Description: TODO(根据项目中的字体库,获取Font的工具类) 
    * @author yabo.liu 
    * @date 2018年9月25日 下午3:54:32 
    *
     */
    public class FontUtil {
      /**
       * 
      * @Title: getFont 
      * @Description: TODO(根据项目字体库,获取Font) 
      * @param @param size
      * @param @return    设定文件 
      * @return Font    返回类型 
      * @date 2018年9月25日 下午3:55:59
      * @throws
       */
      public static Font getFont(float size,String path) {
        String caPath = ParsePDFUtil.class.getClassLoader().getResource("ca").getPath().toString();
        String fontPath = caPath + path;
        try {
            Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, new File(fontPath));
            dynamicFont = dynamicFont.deriveFont(size);
            return dynamicFont;
        }catch (FontFormatException e) {
          e.printStackTrace();
        }catch(IOException e){
          e.printStackTrace();
        }
        
        return null;
      }
      
      
    }

    003.核心代码。

  • 相关阅读:
    赫夫曼树相关算法
    用栈来实现 括号匹配 字符序列检验
    二叉树的建立和遍历
    数据结构-算术表达式求值
    构造一个单链表L,其头结点指针为head,编写程序实现将L逆置
    单链表的基本操作(C语言)数据结构
    java代码打印杨辉三角
    无标题
    写一个方法,判断给定的数字是偶数还是奇数
    关于生物信息学与R的相关资料和网站
  • 原文地址:https://www.cnblogs.com/lyb0103/p/9732586.html
Copyright © 2011-2022 走看看