圖片尺寸相似度匹配

    由於頁面佈局需要,頁面中需要放置圖片的位置,其寬高(比)總是固定的,而後臺某一類圖片尺寸又是千差萬別,爲了使放置在頁面上的圖片,其被拉伸程度縮短到最小,需要後臺對圖片尺寸進行匹配,挑選出一個寬高(比)最近接的圖片放置於頁面進行顯示

如,以下爲存儲圖片的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; // 差別值越小,權重越高
        }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章