私が言及したすべてを適用した後でも、私はまだイメージとのドラマを持っています. 最後に、Gimp を使用して、すべての画像の「反転した垂直」バージョンを作成しました。これで、トランスフォームを使用する必要がなくなりました。うまくいけば、これが今後さらに問題を引き起こすことはありません。
CGContextDrawImage が私の画像を上下逆さまに描画する理由を知っている人はいますか? アプリケーションから画像を読み込んでいます:
Quartz2d は、原点が左下隅にある別の座標系を使用します。そのため、Quartz が 100 * 100 画像のピクセル x[5]、y[10] を描画すると、そのピクセルは左上隅ではなく左下隅に描画されます。したがって、「反転」画像が発生します。
x 座標系が一致するため、y 座標を反転する必要があります。
CGContextTranslateCTM(context, 0, image.size.height);
これは、画像を x 軸で 0 単位、y 軸で画像の高さだけ変換したことを意味します。ただし、これだけでは、画像が上下逆さまになっていて、描画したい場所の下に「image.size.height」が描画されているだけです。
Quartz2D プログラミング ガイドでは、ScaleCTM を使用し、負の値を渡して画像を反転することを推奨しています。これを行うには、次のコードを使用できます-
CGContextScaleCTM(context, 1.0, -1.0);
呼び出しの直前に 2 つを組み合わせるとCGContextDrawImage
、画像が正しく描画されます。
UIImage *image = [UIImage imageNamed:@"testImage.png"];
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, imageRect, image.CGImage);
意図しない結果が得られる可能性があるため、imageRect 座標が画像の座標と一致しない場合は注意してください。
座標を元に戻すには:
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);