2010-01-13 73 views
1

該函數將CGImage旋轉任意度數,但它將圖像剪切一點。我如何避免剪輯?如何修改此代碼,它旋轉CGImage,而不是旋轉時裁剪圖像?

使矩形稍微變大似乎會扭曲正在旋轉的圖像。

+ (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle { 

    float angleInRadians = angle * (M_PI/180); 
    float width = CGImageGetWidth(imgRef); 
    float height = CGImageGetHeight(imgRef); 

    CGRect imgRect = CGRectMake(0, 0, width, height); 
    CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians); 
    CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef bmContext = CGBitmapContextCreate(NULL, 
               rotatedRect.size.width, 
               rotatedRect.size.height, 
               8, 
               0, 
               colorSpace, 
               kCGImageAlphaPremultipliedFirst); 
    CGColorSpaceRelease(colorSpace); 
    CGContextTranslateCTM(bmContext, 
         +(rotatedRect.size.width/2), 
         +(rotatedRect.size.height/2)); 
    CGContextRotateCTM(bmContext, angleInRadians); 
    CGContextTranslateCTM(bmContext, 
         -(rotatedRect.size.width/2), 
         -(rotatedRect.size.height/2)); 
    CGContextDrawImage(bmContext, CGRectMake(0, 0, 
              rotatedRect.size.width, 
              rotatedRect.size.height), 
              imgRef); 

    CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); 
    CFRelease(bmContext); 
    [(id)rotatedImage autorelease]; 

    return rotatedImage; 
} 
+0

嗨安德魯替換線

 CGContextDrawImage(bmContext, CGRectMake(0, 0, rotatedRect.size.width rotatedRect.size.height), imgRef); 

,我試圖使用相同的一段代碼,並沒有想出如何解決它,所以圖像不會被裁剪。你有沒有找到一個好的解決方案呢?謝謝 !! – 2010-09-15 22:31:50

+0

我想也許我用一個透明的邊框填充了有問題的圖像,並以此方式破解了它。回顧一下,我不確定爲什麼我標記了這個答案。 – 2011-09-09 23:05:41

+0

自發布以來已經有一段時間了,但看到新的答案 - 旋轉而不進行裁剪,並在邊界框內保留原始圖像的縱橫比。 – jstevenco 2011-10-19 17:19:06

回答

0

不知道我完全得到這個。這些幾何問題都是困難的。

但只看幾何我會嘗試:

  • 輪旋轉的寬度和高度可達最近的像素。

  • 不要做第二次翻譯。

  • 檢查第一個平移和第一個和第二個角度旋轉的符號。

  • 以矩形(-width/2, - 高度/ 2,寬度,高度)繪製圖像。

+0

這兩個譯文都需要抵消翻譯中心,然後將其翻轉;第一次旋轉僅用於獲取新的邊界矩形的大小。第四個重點是關閉的,但看到我的帖子是正確的答案。 – jstevenco 2011-10-19 17:44:53

+0

哎呀我的壞 - 省略第二個翻譯和使用第四個子彈相當於我的解決方案 - 我會盡可能反向downvote – jstevenco 2011-10-19 17:56:42

1

寫入的代碼沒有考慮源圖像和目標圖像大小的差異。您需要在調用CGContextDrawImage之前或之後對此進行解釋。寫入的代碼也不會保留圖像的原始高寬比 - 它使用目標大小和高度而不是原始大小。

最簡潔的方式來實現的答案示例代碼的OP的問題是


    CGContextDrawImage(bmContext, 
         CGRectMake((rotatedRect.size.width-width)/2., 
            (rotatedRect.size.height-height)/2., 
            width, 
            height), 
         imgRef); 


+0

感謝一堆。我有一個類似的,雖然不相同的問題。我在UIImage上有一個UIImage和一個轉換(轉換是用UIImageView和手勢從一個UI進行的旋轉和縮放轉換的積累,然後我需要將該圖像與背景合併爲一個單獨的圖像,而不是旋轉我有累積變換),我主要工作,但旋轉部分是不正確的,這引導我進來。謝謝!但是,我不確定爲什麼這是完全正確的。您的線加上TranslateCTM在變形的兩側進行變形。 – chadbag 2012-09-25 06:55:31