[WP 7.5] 結合Toolkit GestureService 圖片裁切遭遇橫幅照片處理

[WP 7.5] 結合Toolkit GestureService 圖片裁切遭遇橫幅照片處理

昨天寫了一篇[WP 7.5] 結合Toolkit GestureService 進行圖片裁切的文章

使用的裁切方式為正方形

經過多張照片後發現到一個問題

就是當照片為800*600的橫幅照片時

發現到裁切邊界可以超過橫幅照片的邊界

因為在Image的Stretch預設為Uniform時

這個設定有當邊界超過時候會將照片依據比例縮小並且置中的特性

如果不想要使用者操作出超過邊界的照片時

就必須進行邊界的調整

 

 

裁切前                         裁切後 

     

 

 

我預設照片的邊界為480,這個為Windows Phone目前可顯示的寬度

所以就必須計算出經過縮放後高的值

 

首先先定義出幾個重要的變數值

1.cHeight:經過縮放後的照片高度

2.minHeight:上邊界y軸值

3.maxHeight:下邊界y軸值

 

縮放後高度 = 照片實際高度 x Image物件的寬度 / 照片實際寬度

也就是

cHight = bitimg.PixelHeight * oriPhoto.Width / bitimg.PixelWidth;

得到高度後就可以計算出縮放後高度的上下邊界

minHeight = (oriPhoto.Height - cHight) / 2;
maxHeight = minHeight + cHight;

接著就要對裁切框定位進行微調

transform.TranslateX = x = (oriPhoto.Width - BorderCut.Width) / 2;
transform.TranslateY = y = minHeight;

之後在滑鼠放開後必須進行裁切框邊界的控制

            if (x < 0)
                x = transform.TranslateX = 0;

            if (BorderCut.Width > oriPhoto.Width)
            {
                x = transform.TranslateX = 0;
                BorderCut.Height = BorderCut.Width = oriPhoto.Width;
            }
            if (y < minHeight)
                y = transform.TranslateY = minHeight;

            if (BorderCut.Height > cHight)
            {
                x = transform.TranslateX = 0;
                y = transform.TranslateY = minHeight;
                BorderCut.Height = BorderCut.Width = cHight;
            }

            if ((x + BorderCut.Width) > CanvasImg.Width)
                x = transform.TranslateX = CanvasImg.Width - BorderCut.Width;

            if ((y + BorderCut.Width) > maxHeight)
                y = transform.TranslateY = maxHeight - BorderCut.Width;

以上為我的作法,不過還是希望官方能提供圖片裁切的工具吐舌頭

附上這個專案PhotoGesture.zip給大家參考~~~戴太陽眼鏡