4

電話から Web サービスに画像をアップロードしようとしていますが、画像をアップロードすると画像の向きが失われることに気付きました。画像が正しい向きでアップロードされるようにするために、アップロードする前に何かする必要がありますか?

私も他の場所を見て、C#に変換した画像を回転させる目的のCコードを見つけましたが、回転メソッドを使用するたびに、画像が黒くなります。つまり、何も表示されません。

参照用にコードを添付しています。誰かが私が間違っていることを教えてくれたら本当にありがたいです。ありがとうございました!

    public static UIImage RotateImage(this UIImage image)
    {
        UIImage imageToReturn = null;
        if(image.Orientation == UIImageOrientation.Up)
        {
            imageToReturn = image;
        }
        else 
        {
            CGAffineTransform transform = CGAffineTransform.MakeIdentity();

            switch (image.Orientation) {
                case UIImageOrientation.Down:
                case UIImageOrientation.DownMirrored:
                    transform.Translate(image.Size.Width, image.Size.Height);
                    transform.Rotate((float)Math.PI);
                    break;

                case UIImageOrientation.Left:
                case UIImageOrientation.LeftMirrored:
                    transform.Translate(image.Size.Width, 0);
                    transform.Rotate((float)Math.PI/2);
                    break;

                case UIImageOrientation.Right:
                case UIImageOrientation.RightMirrored:
                    transform.Translate(0, image.Size.Height);
                    transform.Rotate((float)-Math.PI/2);
                    break;
                case UIImageOrientation.Up:
                case UIImageOrientation.UpMirrored:
                    break;
            }

            switch (image.Orientation) {
                case UIImageOrientation.UpMirrored:
                case UIImageOrientation.DownMirrored:
                    transform.Translate(image.Size.Width, 0);
                    transform.Scale(-1, 1);
                    break;

                case UIImageOrientation.LeftMirrored:
                case UIImageOrientation.RightMirrored:
                    transform.Translate(image.Size.Height, 0);
                    transform.Scale(-1, 1);
                    break;
                case UIImageOrientation.Up:
                case UIImageOrientation.Down:
                case UIImageOrientation.Left:
                case UIImageOrientation.Right:
                    break;
            }

            //now draw image
            using(var context = new CGBitmapContext(IntPtr.Zero,
                                                    (int)image.Size.Width, 
                                                    (int)image.Size.Height, 
                                                    image.CGImage.BitsPerComponent,
                                                    image.CGImage.BytesPerRow,
                                                    image.CGImage.ColorSpace,
                                                    image.CGImage.BitmapInfo)){
                context.ConcatCTM(transform);
                switch (image.Orientation) 
                {
                    case UIImageOrientation.Left:
                    case UIImageOrientation.LeftMirrored:
                    case UIImageOrientation.Right:
                    case UIImageOrientation.RightMirrored:
                        // Grr...
                        context.DrawImage(new RectangleF(PointF.Empty,new SizeF(image.Size.Height, image.Size.Width)), image.CGImage);
                        break;
                    default:
                        context.DrawImage(new RectangleF(PointF.Empty, new SizeF(image.Size.Width, image.Size.Height)), image.CGImage);
                        break;
                }

                using(var imageRef = context.ToImage())
                {
                    imageToReturn = new UIImage(imageRef);
                }
            }
        }

        return imageToReturn;
    }
4

3 に答える 3

3

黒い画像が表示される理由は、翻訳と回転の呼び出しが逆になっているためです。iPod/iphone の通常のポートレート写真は「右」の向きです。それらを変換する正しいコードは次を使用します。

        case UIImageOrientation.Right:
        case UIImageOrientation.RightMirrored:
            transform.Rotate (-(float)Math.PI / 2);
            transform.Translate (0, input.Size.Height);
            break;

変換関数は順序に依存します。このコードは画像を正しい向きに回転させますが、回転は左下の 0,0 座標を中心に行われるため、画像はフレームの下部からわずかにずれています。次に、翻訳はそれが属する場所に押し上げます。

元のコードでは、横向きの画像がフレームの上部から押し出されていましたが、回転によって画像が右に回転し、フレームの右側からずれてしまいます。

100 または 200 や pi/4 などの高さの小さな値を使用すると、元の画像の一部が常に表示されるため、これらの関数の順序を変更したときに得られる違いが簡単にわかります。

于 2013-03-07T19:41:39.173 に答える
0

この質問でこの要点を見つけました。このコードがうまくいくことを願っています!

于 2013-02-19T09:34:54.863 に答える