1. 程式人生 > >freemarker匯出word文件對圖片拉伸或拉長的處理

freemarker匯出word文件對圖片拉伸或拉長的處理

*@param iType 圖片型別 已混搭圖 和餅圖為例
  * @param isEnlarge 是否放大 0-不放大,1-放大 選擇性的放大圖片
  * @remarks 當 實際寬高小於目標設定寬高時等比縮小後word展示的圖片過小,此時下可設定等比放大,放大到合適大小
  * @return
  */ 
 public static Map<String,Object> setWH(String imWidth,String imHeight ,String sWidth,String sHeight,String iType,String isEnlarge){
   Map<String,Object> map=new HashMap<String,Object>();
  //設定寬高
  double width =Double.parseDouble(sWidth);
  double height=Double.parseDouble(sHeight);
  //實際寬高
  double iWidth=Double.parseDouble(imWidth);
  double iHeight=Double.parseDouble(imHeight);
  //目標寬高
  Double tW; 
  Double tH;
  
  //混搭圖寬度比例以0.6作為分界點,小於0.6 會拉長,大於0.6會拉伸,餅圖:大於0.7小於1.0時會拉長,大於1.0時會拉伸,次臨界點以不同大小螢幕測試得出的計算值
  if((width/iWidth<0.6 && "1".equals(imageType)) || (width/iWidth>0.7 && width/iWidth<1.0 && "2".equals(imageType))){
   //計算縮放比例
   tW=iWidth*(height/iHeight);  
   tH=iHeight*(height/iHeight); 
  }else{
   //計算縮放比例
   if(width/iWidth<=height/iHeight){     
    tW=iWidth*(width/iWidth); 
    tH=iHeight*(height/iHeight);    
   }else{   
    tW=iWidth*(height/iHeight);  
    tH=iHeight*(height/iHeight); 
   }
   //選擇性的等比放大圖片
   if("1".equals(isEnlarge)){
    //目標寬度或高度小於設定寬度或高度時比例方法
    if(tW<width || tH<height){
     map=enlWH(tW,tH,width,height);
     tW=(Double) map.get("tW");
     tH=(Double)map.get("tH");
    }
   }
  
  }
  
  //圖片cX,cY計算
  //914400為固定係數
  
  map.put("imageWidth", String.valueOf(tW.intValue()*914400/100));
  map.put("imageHeight",String.valueOf((tH.intValue()*914400/100)));
  return map;
 }
 
 /**
  * 比例放大
  * @param width 轉換過的寬度
  * @param height 轉換過的高度
  * @param MaxWidth 目標寬度
  * @param MaxHeight 目標高度
  */
 public static Map<String,Object> enlWH(double width,double height,double maxWidth,double maxHeight){
  Map<String, Object> map = Maps.newConcurrentMap();
   // 放大倍數
  double times = 1;
  //比例
  double sw = (maxWidth * 1.0) / (width * 1.0);
  double sh = (maxHeight * 1.0) / (height * 1.0);
  if (width > maxWidth && height > maxHeight) {
   return map;
  } else if (width < maxWidth && height <= maxHeight) {
   if (sw > sh) {
    times = sw + 0.2;//根據實際情況設定
   } else {
    times = sh + 0.2;
   }
  } else if (width < maxWidth && height > maxHeight) {
   times = sw + 0.2;
  } else {
   times = sh + 0.2;
  }
  NumberFormat nf=NumberFormat.getNumberInstance(); 
  nf.setMaximumFractionDigits(1);
  times=Double.parseDouble(nf.format(times));
  Double lastW = times * width;
  Double lastH = times * height;
  map.put("tW", lastW);
  map.put("tH", lastH);
  return map;
 }