gpt4 book ai didi

ios - 在保存到文件之前旋转图像/上下文

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:18:50 26 4
gpt4 key购买 nike

如何旋转我的上下文?

我已经尝试了所有与 CGAffineTransformRotate()CGContextRotateCTM() 我能想到的组合,但无法使其工作。

下面的代码运行良好。它捕获各种尺寸的图像及其背景,因此它们始终为 320x480 或 480x320。这很重要。但是,我希望水平图像在保存到文件之前旋转 90 度。

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(480, 320), NO, 0.0);
UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 480, 320)];
UIImage *im = [UIImage imageWithContentsOfFile:[allImagePaths objectAtIndex:currImg]];
iv.image = im;
iv.backgroundColor = [UIColor blackColor];
iv.contentMode = UIViewContentModeScaleAspectFit;
CGContextRef context = UIGraphicsGetCurrentContext();
[iv.layer renderInContext:context];
//
// how to rotate it around here?
//
UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
NSData* imageData = UIImageJPEGRepresentation(capturedImage, 1.0);
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
[imageData writeToFile:[docDir stringByAppendingPathComponent:@"result.jpg"] atomically:NO];
UIGraphicsEndImageContext();

每当我添加任何类型的旋转时,它都会出现错误(白色结果图像或屏幕上只有一半图像且未旋转)。

任何对此示例的帮助都会很好。

最佳答案

使用这种分类方法来获得灵感。这不会完全按照您的要求进行,但想法是一样的。

- (UIImage *)fixOrientation 
{
// No-op if the orientation is already correct
if (self.imageOrientation == UIImageOrientationUp) return self;

// We need to calculate the proper transformation to make the image upright.
// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
CGAffineTransform transform = CGAffineTransformIdentity;

switch (self.imageOrientation) {
case UIImageOrientationDown:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
transform = CGAffineTransformRotate(transform, M_PI);
break;

case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
transform = CGAffineTransformTranslate(transform, self.size.width, 0);
transform = CGAffineTransformRotate(transform, M_PI_2);
break;

case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
transform = CGAffineTransformTranslate(transform, 0, self.size.height);
transform = CGAffineTransformRotate(transform, -M_PI_2);
break;
}

switch (self.imageOrientation) {
case UIImageOrientationUpMirrored:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, self.size.width, 0);
transform = CGAffineTransformScale(transform, -1, 1);
break;

case UIImageOrientationLeftMirrored:
case UIImageOrientationRightMirrored:
transform = CGAffineTransformTranslate(transform, self.size.height, 0);
transform = CGAffineTransformScale(transform, -1, 1);
break;
}

// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
CGImageGetBitsPerComponent(self.CGImage), 0,
CGImageGetColorSpace(self.CGImage),
CGImageGetBitmapInfo(self.CGImage));
CGContextConcatCTM(ctx, transform);
switch (self.imageOrientation) {
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
// Grr...
CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
break;

default:
CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage);
break;
}

// And now we just create a new UIImage from the drawing context
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImage imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;
}

关于ios - 在保存到文件之前旋转图像/上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com