private WriteableBitmap GetCropImage() { WriteableBitmap wb = ImgDetail.Source as WriteableBitmap; WriteableBitmap nwb = BitmapFactory.New((int)ResolutionHelper.CurrentResolution.Width, (int)ResolutionHelper.CurrentResolution.Height); double wr = wb.PixelWidth / ResolutionHelper.CurrentResolution.Width; GeneralTransform gtf = ImgFrame.TransformToVisual(ImgDetail); Rect rt = gtf.TransformBounds( new Rect(innerRect.X, innerRect.Y, innerRect.Width, innerRect.Height)); //원본에서 축소된 비율 (화면 로딩 초기 렌더링된 값) double cr = wb.PixelWidth / ImgDetail.ActualWidth; double tx = wb.PixelWidth / innerRect.Width; Rect dstRect = new Rect(0, 0, nwb.PixelWidth, nwb.PixelHeight); Rect srcRect = new Rect(rt.X * cr, rt.Y * cr, rt.Width * cr, rt.Height * cr); //복사된 마이너스 영역을 배경색으로 덧칠 nwb.Blit(dstRect, wb, srcRect, WriteableBitmapExtensions.BlendMode.Additive); //왼쪽 영역이 모자라면 검정색 배경으로 칠함 if (0 < (int)((-rt.X * tx / wr) * transform.ScaleX) && 0 < nwb.PixelHeight) { nwb.FillRectangle(0, 0, (int)((-rt.X * tx / wr) * transform.ScaleX), nwb.PixelHeight, Colors.Black); } //오른쪽 영역이 모자라면 검정색 배경으로 칠함 double right = (ImgDetail.ActualWidth - rt.X) * nwb.PixelWidth / innerRect.Width * transform.ScaleX; if ((int)(right) < nwb.PixelWidth && 0 < nwb.PixelHeight) { nwb.FillRectangle((int)(right), 0, nwb.PixelWidth, nwb.PixelHeight, Colors.Black); } //상단 영역이 모자라면 검정색 배경으로 칠함 if (0 < (int)((-rt.Y * tx / wr) * transform.ScaleY)) { nwb.FillRectangle(0, 0, nwb.PixelWidth, (int)((-rt.Y * tx / wr) * transform.ScaleY), Colors.Black); } //하단 영역이 모자라면 검정색 배경으로 칠함 double bottom = (ImgDetail.ActualHeight - rt.Y) * nwb.PixelHeight / innerRect.Height * transform.ScaleY; if ((int)(bottom) < nwb.PixelHeight && 0 < nwb.PixelWidth) { nwb.FillRectangle(0, (int)(bottom), nwb.PixelWidth, nwb.PixelHeight, Colors.Black); } return(nwb); }
void BrdFrame_ManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e) { if (e.PinchManipulation == null) { //Drag double horizontalChange = e.DeltaManipulation.Translation.X; double verticalChange = e.DeltaManipulation.Translation.Y; //좌측으로 if (horizontalChange < 0 && protectDirection != DragDirection.Left) { transform.TranslateX += horizontalChange; transform.TranslateY += verticalChange; protectDirection = DragDirection.None; } //우측으로 else if (horizontalChange > 0 && protectDirection != DragDirection.Right) { transform.TranslateX += horizontalChange; transform.TranslateY += verticalChange; protectDirection = DragDirection.None; } else if (verticalChange < 0 && protectDirection != DragDirection.Top) { //위로 transform.TranslateX += horizontalChange; transform.TranslateY += verticalChange; protectDirection = DragDirection.None; } else if (verticalChange > 0 && protectDirection != DragDirection.Bottom) { //아래로 transform.TranslateX += horizontalChange; transform.TranslateY += verticalChange; protectDirection = DragDirection.None; } else { return; } //일단 움직이면 축소 가능하도록 설정 canZoomOut = true; GeneralTransform gtf = ImgDetail.TransformToVisual(ImgFrame); Point pt = gtf.Transform(new Point(ImgDetail.ActualWidth, ImgDetail.ActualHeight)); //좌측선 if (pt.X < innerRect.Left) { transform.TranslateX += innerRect.Left - pt.X; protectDirection = DragDirection.Left; canZoomOut = false; } //상단선 if (pt.Y < innerRect.Top) { transform.TranslateY += innerRect.Top - pt.Y; protectDirection = DragDirection.Top; canZoomOut = false; } gtf = ImgFrame.TransformToVisual(ImgDetail); pt = gtf.Transform(new Point(innerRect.Left + innerRect.Width, innerRect.Top + innerRect.Height)); //우측선 if (pt.X < 0) { transform.TranslateX += pt.X; protectDirection = DragDirection.Right; canZoomOut = false; } //하단선 if (pt.Y < 0) { transform.TranslateY += pt.Y; protectDirection = DragDirection.Bottom; canZoomOut = false; } } else { //Pinch double distanceRatio = e.PinchManipulation.CumulativeScale; Size scale = new Size(currentScale.X * distanceRatio, currentScale.Y * distanceRatio); bool isZoomIn = scale.Width > transform.ScaleX; if (isZoomIn) { canZoomOut = true; protectDirection = DragDirection.None; } if (scale.Width <= SCALE_MAX && (canZoomOut || isZoomIn)) { //축소일때 최소영역보다 이하이면 축소하지 않음 if (ImgDetail.ActualWidth * scale.Width >= innerRect.Width / 2 && ImgDetail.ActualHeight * scale.Height >= innerRect.Height / 2) { transform.ScaleX = scale.Width; transform.ScaleY = scale.Height; Point inPoint = new Point(innerRect.Left + innerRect.Width, innerRect.Top + innerRect.Height); CompensationPinch(distanceRatio, ImgFrame, ImgDetail, inPoint, 0, true); CompensationPinch(distanceRatio, ImgFrame, ImgDetail, inPoint, 0, false); inPoint = new Point(ImgDetail.ActualWidth, ImgDetail.ActualHeight); CompensationPinch(distanceRatio, ImgDetail, ImgFrame, inPoint, innerRect.Left, true); CompensationPinch(distanceRatio, ImgDetail, ImgFrame, inPoint, innerRect.Top, false); } } } }