26

私が書いている iOS アプリケーションでは、アルファ チャネルを扱うため、PNG を扱います。何らかの理由で、PNG をimageView問題なく読み込むことができますが、画像をアプリケーションから (PasteBoard に) コピーするか、画像をカメラ ロールに保存するときに、画像が 90 度回転します。

私はこれについてあらゆる場所を検索しましたが、私が学んだことの 1 つは、EXIF 情報のおかげで、JPEG を使用していれば、この問題は発生しない (と思われる) ということです。

私のアプリには完全なコピー/貼り付け機能があり、ここにキッカーがあります (従うのが簡単になるように、これを手順に沿って記述します)。

  1. カメラロールに移動して画像をコピーする
  2. 私のアプリに入って「貼り付け」を押すと、画像がうまく貼り付けられ、一日中それを行うことができます
  3. 私が実装したコピー機能をクリックし、「貼り付け」をクリックすると、画像は貼り付けられますが、回転します。

上記のステップ 2 に戻って [保存] をクリックすると、写真はライブラリに保存されますが、90 度回転されているため、コピー アンド ペースト コードに問題があるとは 100% 確信していません。

さらに奇妙なのは、インターネットからダウンロードした画像では問題なく動作するように見えますが、電話で手動で撮影した画像ではうまくいかないことです。うまくいくものもあれば、うまくいかないものもある...

誰もこれについて何か考えがありますか?私が使用できる回避策はありますか?私のイメージの約 75% でコードが機能することを確信しています。ただし、リクエストに応じてコードを投稿できます。

4

6 に答える 6

14

既存の画像imageOrientationプロパティが原因で問題が発生した場合は、次のように異なる向きで同じ画像を作成できます。

CGImageRef imageRef = [sourceImage CGImage];

UIImage *rotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp];

置換画像に設定する方向を実験する必要がある場合があります。最初の方向に基づいて切り替えることもできます。

また、メモリ使用量にも注意してください。写真アプリが不足することがよくあります。これにより、ソース画像をリリースするまで、写真ごとのストレージが 2 倍になります。

于 2012-04-25T02:46:32.593 に答える
13

数日かかりましたが、@Dondragmer が投稿した回答のおかげで、ようやく理解できました。しかし、私は完全な解決策を投稿すると考えました。

したがって、基本的には、画像をインテリジェントに自動回転するメソッドを作成する必要がありました。マイナス面は、このメソッドをコード全体で呼び出す必要があり、特にモバイル デバイスで作業している場合は、プロセッサを集中的に使用することですが、プラス面は、画像の取得、画像のコピー、画像の貼り付け、および画像の保存と保存ができることです。それらはすべて適切に回転します。これが私が最終的に使用したコードです(メソッドはまだ100%完成しておらず、メモリリークなどを編集する必要があります)。

私は、アプリケーションに初めて画像が挿入されたことを知りました(ユーザーが「画像を撮る」、「画像を貼り付ける」、または「画像を選択する」を押したことが原因であるかどうかにかかわらず、何らかの理由で自動なしで問題なく挿入されます回転. この時点で、回転値が何であれ、 というグローバル変数に保存しましたimageOrientationWhenAddedToScreen. これにより、作業が楽になりました. 画像を操作して画像をプログラムから保存するとき、このキャッシュされたグローバル変数をチェックして、画像を適切に回転する必要があるかどうかを判断しました。

    - (UIImage*) rotateImageAppropriately:(UIImage*) imageToRotate {
    //This method will properly rotate our image, we need to make sure that
    //We call this method everywhere pretty much...

    CGImageRef imageRef = [imageToRotate CGImage];
    UIImage* properlyRotatedImage;

    if (imageOrientationWhenAddedToScreen == 0) {
       //Don't rotate the image
        properlyRotatedImage = imageToRotate;

    } else if (imageOrientationWhenAddedToScreen == 3) {

        //We need to rotate the image back to a 3
        properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:3];

    } else if (imageOrientationWhenAddedToScreen == 1) {

        //We need to rotate the image back to a 1
        properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:1];        

    }

    return properlyRotatedImage;

}

なぜ Apple がこの奇妙な画像回転動作をするのか、まだ 100% 確信が持てません (これを試してみてください... 携帯電話を逆さまにして写真を撮ると、最終的な写真が正しい向きになることに気付くでしょう - おそらくこれApple がこのタイプの機能を備えているのはなぜですか?)。

私はこれを理解するのにかなりの時間を費やしたことを知っているので、他の人の助けになることを願っています!

于 2012-04-29T03:13:33.173 に答える
0

これを達成するためのもう1つの方法を次に示します。

@IBAction func rightRotateAction(sender: AnyObject) {

    let imgToRotate = CIImage(CGImage: sourceImageView.image?.CGImage)
    let transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
    let rotatedImage = imgToRotate.imageByApplyingTransform(transform)
    let extent = rotatedImage.extent()
    let contex = CIContext(options: [kCIContextUseSoftwareRenderer: false])
    let cgImage = contex.createCGImage(rotatedImage, fromRect: extent)
    adjustedImage = UIImage(CGImage: cgImage)!
    UIView.transitionWithView(sourceImageView, duration: 0.5, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: {
            self.sourceImageView.image = self.adjustedImage
        }, completion: nil)
}
于 2015-08-13T10:38:32.870 に答える