2

我创建了一个应用程序,我可以在其中使用手势旋转、调整大小、翻译图像。然后我需要从UIImageView. 我在Stack-overflow的某个地方找到了这部分代码。这里虽然回答了笑脸问题,但是需要输入角度。同一个人在其他地方写了我正在使用的更好的解决方案。但它有一个问题。通常它会返回一个空白图像。或截断的图像(通常从顶部)。因此代码有问题,需要进行一些更改。我的问题是,我是 Core-graphics 的新手,并且严重陷入了这个问题。

UIGraphicsBeginImageContext(imgView.image.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGAffineTransform transform = imgView.transform;
transform = CGAffineTransformScale(transform, 1.0, -1.0);
CGContextConcatCTM(context, transform);
CGContextDrawImage(context, CGRectMake(0, 0, imgView.image.size.width, imgView.image.size.height), imgView.image.CGImage);
UIImage *newRotatedImage = [UIImage imageWithCGImage: CGBitmapContextCreateImage(context)];
UIGraphicsEndImageContext();

编辑 1.1 感谢您的示例代码,但它又出现了问题。让我更详细地解释一下,我正在使用手势来缩放、翻译和调整图像大小。所以所有这些数据都保存在 imageview 的 transform 属性中。我喜欢 core-image 中的另一种方法。所以我将代码更改为:

CGRect bounds =  CGRectMake(0, 0, imgTop.size.width, imgTop.size.height);
CIImage *ciImage = [[CIImage alloc] initWithCGImage:imageView.image.CGImage options:nil];
CGAffineTransform transform = imgView.transform;
ciImage = [ciImage imageByApplyingTransform:transform];
return [UIImage imageWithCIImage:ciImage] ;

现在我得到了挤压和错误尺寸的镜像。很抱歉再次打扰您。你能指导我如何在 coreimage 中使用 imageview 的变换来获得正确的图像吗?

4

4 回答 4

3
CIImage *ciImage = [[CIImage alloc] initWithCGImage:fximage.CGImage options:nil];
CGAffineTransform transform = fxobj.transform;
float angle = atan2(transform.b, transform.a);
transform = CGAffineTransformRotate(transform, - 2 * angle);
ciImage = [ciImage imageByApplyingTransform:transform];
UIImage *screenfxImage = [UIImage imageWithCIImage:ciImage];

请记住添加代码:transform = CGAffineTransformRotate(transform, - 2 * angle);因为旋转方向相反

于 2012-06-14T04:48:38.260 回答
1

这是文档的链接:- http://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html

旋转图像的示例代码:-

        CIImage *inputImage = [[CIImage alloc] initWithImage:currentImage];
        CIFilter * controlsFilter = [CIFilter filterWithName:@"CIAffineTransform"];
        [controlsFilter setValue:inputImage forKey:kCIInputImageKey];
        [controlsFilter setValue:[NSNumber numberWithFloat:slider.value] forKey:@"inputAngle"];
        CIImage *displayImage = controlsFilter.outputImage;
        UIImage *finalImage = [UIImage imageWithCIImage:displayImage];

        CIContext *context = [CIContext contextWithOptions:nil];
        if (displayImage == nil || finalImage == nil) {
            // We did not get output image. Let's display the original image itself.
            photoEditView.image = currentImage;
        }
         else {

            CGImageRef imageRef = [context createCGImage:displayImage fromRect:displayImage.extent];
            photoEditView.image = [UIImage imageWithCGImage:imageRef];
            CGImageRelease(imageRef);
        }
        context = nil;
        [inputImage release];
于 2012-04-07T05:17:48.287 回答
1

我为这类事情创建了一个 Objective-C 类。你可以在 GitHub ANImageBitmapRep上查看它。以下是您将如何进行旋转:

ANImageBitmapRep * ibr = [myImage image];
[ibr rotate:anAngle];
UIImage * rotated = [ibr image];

请注意,这里anAngle是弧度。

于 2012-04-06T20:49:38.697 回答
0

我在目标 C 中创建了示例应用程序来执行此操作(减去缩放部分)。如果有人感兴趣,您可以在此处下载:https ://github.com/gene-code/coregraphics-drawing/tree/master/coregraphics-绘图/测试

于 2020-09-27T05:48:31.603 回答