ss1271's Site

风餐露宿,不可一日无码.

Windows Phone自定义相机图片旋转问题

| Comments

昨天遇到一个问题一直悬而未决到今天: 首先,相机获取的原始相片是Landscape的,按照官方文档的说法,方向是快门按键处于右上方,听筒向左这样一个方向拍出来的照片。说白了就是相片逆时针90度。因为我的程序需要获取的是Portrait(竖着的)相片,所以需要有一步旋转,并且还要做缩放以使得图片可以完整显示在指定的容器内。 C#下用RotateTransform旋转图片的时候会遇到莫名其妙的图片切割(StackOverflow上的问题描述以及一种解决方案见此,此方案适用于容器原点和图片原点不一致的情况),也就是说图片旋转完成之后不是完整的图片,会被容器切割,而且因为原点的问题,会导致你得到的结果完全不像单纯转了一下图片,然后发现图被Crop了。 比如我取景是这样(不要误会,这是公司的Lumia 800): 然后得到的结果却是: 如果精细一点儿计算的话,会发现:
  • 图片和容器共用一个原点(即容器的左上角,二者重叠)
  • 需要如果需要显示正常的图片,需要按顺序:Scale-Rotate-Matrix(Set X Offset)
如果用图来表示的话,应该更清楚:
问题和解决方案都明晰之后,上代码: 需要注意的是,TransformGroup是有顺序的,是按照你加入的顺序来进行变换。先加入的变换先做。在我的这个例子里,变换顺序比较重要,如果顺序不对,代码也是要修改的。 [csharp] // We use Scale, Rotate and Matrix(for custom transformation) ScaleTransform st = new ScaleTransform(); RotateTransform rt = new RotateTransform(); MatrixTransform mt = new MatrixTransform(); TransformGroup tg = new TransformGroup(); // Initialize a Image Image image = new Image() { Source = bi, Width = origWidth, Height = origHeight, Stretch = Stretch.UniformToFill }; //destWith & destHeight are the container’s dimension WriteableBitmap result = new WriteableBitmap((int)destWidth, (int)destHeight); if (isFromCamera)// if camera flag is true, do CW 90 degree rotation { // Swap width and height of the original pic first var temp = origWidth; origWidth = origHeight; origHeight = temp; origRatio = 1 / origRatio; if (origRatio < destRatio)// align height with canvas { st.ScaleY = destHeight / origHeight; st.ScaleX = st.ScaleY; } else // align with width { st.ScaleX = destWidth / origWidth; st.ScaleY = st.ScaleX; } // Add scale transform to transform group tg.Children.Add(st); //do CW 90 rotation rt.Angle = 90; rt.CenterX = 0; rt.CenterY = 0; // Add rotation transform to the group tg.Children.Add(rt); //do offset move on x-axis mt.Matrix = new Matrix() { //this value should be the resized width of your image OffsetX = destWidth }; // Add matrix transform to the group tg.Children.Add(mt); result.Render(image, tg); result.Invalidate(); } [/csharp] 以上,希望能帮到有同样问题的朋友。

Comments