由於頁面佈局需要,頁面中需要放置圖片的位置,其寬高(比)總是固定的,而後臺某一類圖片尺寸又是千差萬別,爲了使放置在頁面上的圖片,其被拉伸程度縮短到最小,需要後臺對圖片尺寸進行匹配,挑選出一個寬高(比)最近接的圖片放置於頁面進行顯示
如,以下爲存儲圖片的PO類
public class PicContentPO {
/**
* 圖片名稱。
*/
private String name;
/**
* 圖像寬度 單位像素。
*/
private Integer picWidth;
/**
* 圖像高度 單位像素。
*/
private Integer picHeight;
public Integer getPicWidth() {
return picWidth;
}
public void setPicWidth(Integer picWidth) {
this.picWidth = picWidth;
}
public Integer getPicHeight() {
return picHeight;
}
public void setPicHeight(Integer picHeight) {
this.picHeight = picHeight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
爲了從衆多PicContentPO中,找出與指定寬高(比)最接近的圖片,可使用Comparator類對衆多PicContentPO進行排序,下標越小的PicContentPO,其匹配程度越高
class PosterComparator implements Comparator<PicContentPO> {
private int width;
private int height;
public PosterComparator(int width, int height) {
this.height = height;
this.width = width;
}
/**
* 算法說明:值越小和固定尺寸越匹配
* S1=非重疊部分面積 S0=重疊部分面積 K1=V1,V2圖形斜率 K0=固定尺寸的斜率
* (|K1-K0|+1) * S1/S0
*/
@Override
public int compare(PicContentPO v1, PicContentPO v2) {
// v1 > v2 v1參數有誤,選v2
if (v1 == null || v1.getPicHeight() == null || v1.getPicWidth() == null
|| v1.getPicHeight() == 0 || v1.getPicWidth() == 0) {
return 1;
}
// v1 < v2 v2參數有誤,選v1
if (v2 == null || v2.getPicHeight() == null || v2.getPicWidth() == null
|| v2.getPicHeight() == 0 || v2.getPicWidth() == 0) {
return -1;
}
// 計算v1和標準區域的差別值
int minHeight = Math.min(height, v1.getPicHeight());
int minWidth = Math.min(width, v1.getPicWidth());
// v1和標準的非重疊部分面積
// 兩個圖形相互不包含
// ┌────┐
// │ │
// ├────┼────┐
// │ │ │
// └────┴────┘
int result1 = Math.abs((v1.getPicWidth() - width) * minHeight)
+ Math.abs((v1.getPicHeight() - height) * minWidth);
// 兩個圖形一大包含一小
// ┌──────────────┐
// ├──────┐ │
// │ │ │
// └──────┴───────┘
if ((v1.getPicWidth() - width) * (v1.getPicHeight() - height) > 0) {
result1 = result1 + (v1.getPicWidth() - width) * (v1.getPicHeight() - height);
}
// v1與標準尺寸的匹配係數
result1 = (Math.abs(v1.getPicHeight() / v1.getPicWidth() - height / width) + 1)
* result1 / (minHeight * minWidth);
// 計算v2和標準區域的差別值
minHeight = Math.min(height, v2.getPicHeight());
minWidth = Math.min(width, v2.getPicWidth());
// v2和標準的非重疊部分面積
// 兩個圖形相互不包含
int result2 = Math.abs((v2.getPicWidth() - width) * minHeight)
+ Math.abs((v2.getPicHeight() - height) * minWidth);
// 兩個圖形一大包含一小
if ((v2.getPicWidth() - width) * (v2.getPicHeight() - height) > 0) {
result2 = result2 + (v2.getPicWidth() - width) * (v2.getPicHeight() - height);
}
// v2與標準尺寸的匹配係數
result2 = (Math.abs(v2.getPicHeight() / v2.getPicWidth() - height / width) + 1)
* result2 / (minHeight * minWidth);
return result1 - result2; // 差別值越小,權重越高
}
}