UIImage の orientation を UIImageOrientationUp に固定する処理が必要だったので 拾ってきたソースコードを信じてそのまま使ったのだが、処理が出鱈目で滅茶苦茶な結果になった。
そのコードの作者もどっかから拾ってきたコードをそのまま使っていたみたいで、 こうやってクソコードが拡大されていくのだなあ、と思った。
結局自前で書いたものがこれ。一応テストしたのであってるはず。
CGAffineTransform
GetAffineTransformToFixImageOrientation(UIImageOrientation imageOrientation, CGSize imageSize)
{
switch (imageOrientation) {
case UIImageOrientationUp:
return CGAffineTransformIdentity;
case UIImageOrientationLeft:
return CGAffineTransformMake(0, 1, -1, 0, imageSize.height, 0);
case UIImageOrientationDown:
return CGAffineTransformMake(-1, 0, 0, -1, imageSize.width, imageSize.height);
case UIImageOrientationRight:
return CGAffineTransformMake(0, -1, 1, 0, 0, imageSize.width);
case UIImageOrientationUpMirrored:
return CGAffineTransformMake(-1, 0, 0, 1, imageSize.width, 0);
case UIImageOrientationDownMirrored:
return CGAffineTransformMake(1, 0, 0, -1, 0, imageSize.height);
case UIImageOrientationLeftMirrored:
return CGAffineTransformMake(0, -1, -1, 0, imageSize.height, imageSize.width);
case UIImageOrientationRightMirrored:
return CGAffineTransformMake(0, 1, 1, 0, 0, 0);
default:
return CGAffineTransformIdentity;
}
こんな感じで使う
CGSize originalImageSize = CGSizeMake(CGImageGetWidth(originalImage), CGImageGetHeight(originalImage));
CGAffineTransform transform = GetAffineTransformToFixImageOrientation(imageOrientation, originalImageSize);
CGSize fixedImageSize = CGSizeApplyAffineTransform(originalImageSize, transform);
fixedImageSize = CGSizeMake(ABS(fixedImageSize.width), ABS(fixedImageSize.height));
CGContextRef ctx =
CGBitmapContextCreate(NULL, fixedImageSize.width, fixedImageSize.height, CGImageGetBitsPerComponent(originalImage), 0,
CGImageGetColorSpace(originalImage), CGImageGetBitmapInfo(originalImage));
CGContextConcatCTM(ctx, transform);
CGContextDrawImage(ctx, (CGRect){CGPointZero, originalImageSize}, originalImage);
CGImageRef fixedImage = CGBitmapContextCreateImage(ctx);
CGContextRelease(ctx);
...
dispatch_get_current_queue() は使わないこと!! See