201302

Top


2013-02-10

13:16

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);
    ...
13:35

dispatch_get_current_queue() は使わないこと!! See