freemarker匯出word文件對圖片拉伸或拉長的處理
阿新 • • 發佈:2019-02-04
*@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;
}
* @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;
}