2011-07-07 33 views
1

UIスライダコントロールで画像を回転します。画像を回転し、回転状態で画像を保存します

私はそれが 完璧に動作します。この機能を使用することにより、以下の機能

 
- (void)rotateImage:(UIImageView *)image duration:(NSTimeInterval)duration 
       curve:(int)curve degrees:(CGFloat)degrees 
{ 
    // Setup the animation 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:duration]; 
    [UIView setAnimationCurve:curve]; 
    [UIView setAnimationBeginsFromCurrentState:YES];

// The transform matrix CGAffineTransform transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(degrees)); image.transform = transform; // Commit the changes [UIView commitAnimations];}

でそれを行っているが、問題は、私は回転させた画像の参照を保存することができないということです。 回転した画像を後で処理するために使用する必要があります。

どうすれば回転した位置にある画像を保存できますか?あなたにスケーリングを適用する。この場合、

CGAffineTransform transform = CGAffineTransformScale(previousTransform, newScale, newScale); 

この問題で私を助けてください

おかげ

さらなる処理に

答えて

3

:-)、StackOverflowのにないようにコンパイラにこれを入力した私は解決策を見つけました私の質問

この

- (UIImage*)upsideDownBunny:(CGFloat)radians withImage:(UIImage*)testImage { 
    __block CGImageRef cgImg; 
    __block CGSize imgSize; 
    __block UIImageOrientation orientation; 
    dispatch_block_t createStartImgBlock = ^(void) { 
     // UIImages should only be accessed from the main thread 

     UIImage *img =testImage 
     imgSize = [img size]; // this size will be pre rotated 
     orientation = [img imageOrientation]; 
     cgImg = CGImageRetain([img CGImage]); // this data is not rotated 
    }; 
    if([NSThread isMainThread]) { 
     createStartImgBlock(); 
    } else { 
     dispatch_sync(dispatch_get_main_queue(), createStartImgBlock); 
    } 
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
    // in iOS4+ you can let the context allocate memory by passing NULL 
    CGContextRef context = CGBitmapContextCreate(NULL, 
               imgSize.width, 
               imgSize.height, 
               8, 
               imgSize.width * 4, 
               colorspace, 
               kCGImageAlphaPremultipliedLast); 
    // rotate so the image respects the original UIImage's orientation 
    switch (orientation) { 
     case UIImageOrientationDown: 
      CGContextTranslateCTM(context, imgSize.width, imgSize.height); 
      CGContextRotateCTM(context, -radians); 
      break; 
     case UIImageOrientationLeft: 
      CGContextTranslateCTM(context, 0.0, imgSize.height); 
      CGContextRotateCTM(context, 3.0 * -radians/2.0); 
      break; 
     case UIImageOrientationRight: 
      CGContextTranslateCTM(context,imgSize.width, 0.0); 
      CGContextRotateCTM(context, -radians/2.0); 
      break; 
     default: 
      // there are mirrored modes possible 
      // but they aren't generated by the iPhone's camera 
      break; 
    } 
    // rotate the image upside down 

    CGContextTranslateCTM(context, +(imgSize.width * 0.5f), +(imgSize.height * 0.5f)); 
    CGContextRotateCTM(context, -radians); 
    //CGContextDrawImage(context, CGRectMake(0.0, 0.0, imgSize.width, imgSize.height), cgImg); 
    CGContextDrawImage(context, (CGRect){.origin.x = -imgSize.width* 0.5f , .origin.y = -imgSize.width* 0.5f , .size.width = imgSize.width, .size.height = imgSize.width}, cgImg); 
    // grab the new rotated image 
    CGContextFlush(context); 
    CGImageRef newCgImg = CGBitmapContextCreateImage(context); 
    __block UIImage *newImage; 
    dispatch_block_t createRotatedImgBlock = ^(void) { 
     // UIImages should only be accessed from the main thread 
     newImage = [UIImage imageWithCGImage:newCgImg]; 
    }; 
    if([NSThread isMainThread]) { 
     createRotatedImgBlock(); 
    } else { 
     dispatch_sync(dispatch_get_main_queue(), createRotatedImgBlock); 
    } 
    CGColorSpaceRelease(colorspace); 
    CGImageRelease(newCgImg); 
    CGContextRelease(context); 
    return newImage; 
} 
するための方法の下にこれを使用します

コール今、我々は回転状態を保存することができます

360に0の間で回転がsliderValueある

UIImage *rotated2 = [self upsideDownBunny:rotation]; 

と、この方法。

+0

ダーシャンに感謝しています。 – AJPatel

+0

それは完璧に動作することを聞いていいです.Thaks – darshan

0

一つのアプローチは、中のように、順番に複数の変換を適用しています回転した画像。

後で変換をやり直すためにこの情報を保存する必要がある場合は、回転の角度、スケーリング係数(私の例では)、および変換をもう一度構築するだけです。

CGAffineTransformをあなたのクラスまたは他の仕組みの瓶に保存することも考えられます。あなたは、ファイルへの保存を意味し保存することによって、あなたは、このコードを画像に表示を変えることができるかどう

EDIT

NSData *data; 
NSBitmapImageRep *rep; 
rep = [self bitmapImageRepForCachingDisplayInRect:[self frame]]; 
[self cacheDisplayInRect:[self frame] toBitmapImageRep:rep]; 
data = [rep TIFFRepresentation]; 

は、あなたが保存したNSDataをファイルに

PNGの場合:

UIGraphicsBeginImageContext(self.bounds.size); 
[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage* image1 = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
NSData *imageData = UIImagePNGRepresentation(image1); 
[imageData writeToFile:filePath atomically:YES]; 
+0

私はイメージを回転するのに問題はありませんでしたが、問題は回転イメージを保存する必要があることです。どうすればいいのですか? – darshan

+0

保存するとどういう意味ですか? – sergio

+0

イメージを回転した位置に保存します。 – darshan

0

回転イメージを別のイメージにレンダリングすることができます:

UIGraphicsBeginImageContext(aCGRectToHoldYourImage); 
CALayer* layer = myRotatedImageView.layer; 

[layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

し、そのからPNGデータを取得し、ファイルに保存し

NSData* myPNGData = [viewImage UIImagePNGRepresentation]; 
[myPNGData writeToFile:@"aFileName.png" atomically:YES]; 

但し書きが、私は

0

UIImageViewの変換値を保存し、次回このUIImageViewを使用する場合や、別のUIImageViewでもこの変換値を適用します。

+0

すべてのキャップは何ですか? –

1

私は、上記のコードを試してみました、それが働いているだけSQUARE画像のために、ここでは画像を再描画し、右の幅/高さを維持する別の作業溶液、次のとおりです。

- (UIImage *) rotatedImage:(UIImage *)imageRotation and:(CGFloat) rotation 
{ 
// Calculate Destination Size 
CGAffineTransform t = CGAffineTransformMakeRotation(rotation); 
CGRect sizeRect = (CGRect) {.size = imageRotation.size}; 
CGRect destRect = CGRectApplyAffineTransform(sizeRect, t); 
CGSize destinationSize = destRect.size; 

// Draw image 
UIGraphicsBeginImageContext(destinationSize); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(context, destinationSize.width/2.0f, destinationSize.height/2.0f); 
CGContextRotateCTM(context, rotation); 
[imageRotation drawInRect:CGRectMake(-imageRotation.size.width/2.0f, -imageRotation.size.height/2.0f, imageRotation.size.width, imageRotation.size.height)]; 

// Save image 
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return newImage; 

}

ここでのrotationパラメータは、Radianで指定します。あなたの機能の上にこれを追加することによって、変換を実行する(またはあなたがファイルを直接.M中)

#define M_PI 3.14159265358979323846264338327950288 /* pi */ 
#define DEGREES_TO_RADIANS(angle) (angle/180.0 * M_PI) 

最後に、私はアニメーションでこれを呼ばれることができます。

[UIView animateWithDuration:0.5f delay:0 options:UIViewAnimationCurveEaseIn animations:^{ 
    //Only used for the ANIMATION of the uiimage 
    imageView.transform = CGAffineTransformRotate(editorPad.transform, DEGREES_TO_RADIANS(90)); 
}completion:^(BOOL finished) { 
    // Workaround : Need to set previous transformation back or the next step will turn the image more 
    imageView.transform = CGAffineTransformRotate(imageView.transform, DEGREES_TO_RADIANS(-90)); 
    imageView.image = [self imageView.image and:DEGREES_TO_RADIANS(90)]; 
}]; 

私は、これはあまりにも助けることができる願っています!

乾杯。

関連する問題