2014-09-28 218 views
0

對於給定的UIImage,我的目標是生成另一個UIImage,它是原始圖像的對角鏡像版本。我正在使用Core Graphics來實現這一點。iOS:如何使用核心圖形對角鏡像圖像

我的嘗試是,以生成仿射變換矩陣爲對角鏡操作如下:

| 0 1 0 |
| 1 0 0 |
| 0 0 1 |

但是得到的圖像來作爲旋轉的圖像,而不是對角鏡像...

更具體地說,這裏是我試過的代碼:

+ (UIImage *)mirrorImageDiagonal:(UIImage *)fromImage 
{ 
    CGContextRef mainViewContentContext = MyCreateBitmapContext(fromImage.size.width, fromImage.size.height); 


    CGAffineTransform transform = CGAffineTransformIdentity; 
    transform.a = 0; 
    transform.b = 1; 
    transform.c = 1; 
    transform.d = 0; 
    transform.tx = 0; 
    transform.ty = 0; 
    CGContextConcatCTM(mainViewContentContext, transform); 

    // draw the image into the bitmap context 
    CGContextDrawImage(mainViewContentContext, CGRectMake(0, 0, fromImage.size.width, fromImage.size.height), fromImage.CGImage); 

    // create CGImageRef of the main view bitmap content, and then release that bitmap context 
    CGImageRef reflectionImage = CGBitmapContextCreateImage(mainViewContentContext); 
    CGContextRelease(mainViewContentContext); 

    // convert the finished reflection image to a UIImage 
    UIImage *theImage = [UIImage imageWithCGImage:reflectionImage]; 

    // image is retained by the property setting above, so we can release the original 
    CGImageRelease(reflectionImage); 

    return theImage; 
} 

與變換矩陣的問題?或者我如何使用Core Graphics?

回答

0

您正在使用的矩陣將應用關於座標對角線而不是圖像對角線的變換。 (除非圖像在這種情況下具有正方形尺寸,否則它們是相同的斧頭)。

你得到的圖像,但它似乎是一個旋轉,但實際上它是一個倒像;

+ (UIImage *)mirrorImageDiagonal1:(UIImage *)fromImage{ 

     //large square (max(h,w),max(h,w)) 
     CGSize neededSize = CGSizeMake(fromImage.size.height, fromImage.size.height);//should be max(h,w) 

     UIGraphicsBeginImageContext(mirrorSize); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 

     // Tanslate and scale upside-down to compensate for Quartz's inverted coordinate system 

     CGContextTranslateCTM(context, 0, fromImage.size.height); 
     CGContextScaleCTM(context, 1.0, -1.0); 


     CGAffineTransform transform = CGAffineTransformIdentity; 
     transform.a = 0; 
     transform.b = 1; 
     transform.c = 1; 
     transform.d = 0; 
     transform.tx = 0; 
     transform.ty = 0; 
     //transform = CGAffineTransformInvert(transform); 
     CGContextConcatCTM(context, transform); 

     // draw the image into the bitmap context 
     CGContextDrawImage(context, CGRectMake(0,0 , fromImage.size.width, fromImage.size.height), fromImage.CGImage); 



     // create CGImageRef of the main view bitmap content, and then release that bitmap context 

     CGImageRef reflectionImage = CGBitmapContextCreateImage(context); 

     CGContextRelease(context); 

     // convert the finished reflection image to a UIImage 
     UIImage *theImage = [UIImage imageWithCGImage:reflectionImage]; 

     // image is retained by the property setting above, so we can release the original 
     CGImageRelease(reflectionImage); 

     return theImage; 
    }