我正在尝试创建一个沿X轴,Y轴或两者翻转UIImage的方法。我一直在接近,但是我的变换知识还不够好,无法一路走到那里。这是我到目前为止的代码:
- (UIImage *)flippedImageByAxis:(MVImageFlip)axis{
UIGraphicsBeginImageContext(self.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGAffineTransform verticalFlip = CGAffineTransformMake(1, 0, 0, -1, 0, self.size.height);
CGAffineTransform horizFlip = CGAffineTransformMake(-1.0, 0.0, 0.0, 1.0, self.size.width, 0.0);
if(axis == MVImageFlipXAxis || axis == MVImageFlipXAxisAndYAxis)
CGContextConcatCTM(context, horizFlip);
if(axis == MVImageFlipYAxis || axis == MVImageFlipXAxisAndYAxis)
CGContextConcatCTM(context, verticalFlip);
CGContextDrawImage(context, CGRectMake(0.0, 0.0, self.size.width, self.size.height), [self CGImage]);
UIImage *flipedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return flipedImage;
}
这会翻转图像但不正确。 Y翻转图像根本不会翻转,X翻转图像看起来像XY图像应该看起来像,并且XY图像看起来像Y图像应该是什么样子。结合变换并让它们正常工作会让我头疼。
MVImageFlip枚举就是您在代码中看到的三个。没什么特别的。
答案 0 :(得分:24)
我终于能够弄明白了。以下代码适用于可能需要它的任何其他人。
- (UIImage *)flippedImageByAxis:(MVImageFlip)axis{
UIGraphicsBeginImageContext(self.size);
CGContextRef context = UIGraphicsGetCurrentContext();
if(axis == MVImageFlipXAxis){
// Do nothing, X is flipped normally in a Core Graphics Context
} else if(axis == MVImageFlipYAxis){
// fix X axis
CGContextTranslateCTM(context, 0, self.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);
// then flip Y axis
CGContextTranslateCTM(context, self.size.width, 0);
CGContextScaleCTM(context, -1.0f, 1.0f);
} else if(axis == MVImageFlipXAxisAndYAxis){
// just flip Y
CGContextTranslateCTM(context, self.size.width, 0);
CGContextScaleCTM(context, -1.0f, 1.0f);
}
CGContextDrawImage(context, CGRectMake(0.0, 0.0, self.size.width, self.size.height), [self CGImage]);
UIImage *flipedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return flipedImage;
}
答案 1 :(得分:9)
尝试以下方法:
UIImage* myimage = [UIImage imageNamed: @"myimage.png"];
myimage = [UIImage imageWithCGImage: myimage.CGImage scale: 1.0f orientation: UIImageOrientationUpMirrored];
答案 2 :(得分:5)
如果您打算只显示图像而不保存图像,则可能不希望创建第二个CGContext。在UIImage中使用已经加载的CGImage会更有效率,并改变方向如下:
- (UIImage *)flippedImageByFlippingAlongXAxis:(BOOL)flipOnX andAlongYAxis:(BOOL)flipOnY
{
UIImageOrientation currentOrientation = self.imageOrientation;
UIImageOrientation newOrientation = currentOrientation;
if (flipOnX == YES) {
switch (newOrientation) {
case UIImageOrientationUp:
newOrientation = UIImageOrientationDown;
break;
case UIImageOrientationDown:
newOrientation = UIImageOrientationUp;
break;
case UIImageOrientationUpMirrored:
newOrientation = UIImageOrientationDownMirrored;
break;
case UIImageOrientationDownMirrored:
newOrientation = UIImageOrientationUpMirrored;
break;
case UIImageOrientationLeft:
newOrientation = UIImageOrientationLeftMirrored;
break;
case UIImageOrientationRight:
newOrientation = UIImageOrientationRightMirrored;
break;
case UIImageOrientationLeftMirrored:
newOrientation = UIImageOrientationLeft;
break;
case UIImageOrientationRightMirrored:
newOrientation = UIImageOrientationRight;
break;
}
}
if (flipOnY == YES) {
switch (newOrientation) {
case UIImageOrientationUp:
newOrientation = UIImageOrientationUpMirrored;
break;
case UIImageOrientationDown:
newOrientation = UIImageOrientationDownMirrored;
break;
case UIImageOrientationUpMirrored:
newOrientation = UIImageOrientationUp;
break;
case UIImageOrientationDownMirrored:
newOrientation = UIImageOrientationDown;
break;
case UIImageOrientationLeft:
newOrientation = UIImageOrientationRight;
break;
case UIImageOrientationRight:
newOrientation = UIImageOrientationLeft;
break;
case UIImageOrientationLeftMirrored:
newOrientation = UIImageOrientationRightMirrored;
break;
case UIImageOrientationRightMirrored:
newOrientation = UIImageOrientationLeftMirrored;
break;
}
}
return [UIImage imageWithCGImage:self.CGImage scale:self.scale orientation:newOrientation];
}
当您使用CGContextDrawImage启动新的CGContext并进行翻转时,您将分配另一个内存块以按不同的顺序保存相同的字节。通过更改UIImage方向,您可以避免其他分配。使用相同的图像数据,仅以不同的方向绘制。
答案 3 :(得分:1)
这仅仅是@ultramiraculous的旧答案的一个稍微固定和'更新到Swift'版本。以防它有助于某人。
垂直翻转(x轴反射):
func flipV(im:UIImage)->UIImage {
var newOrient:UIImageOrientation
switch im.imageOrientation {
case .Up:
newOrient = .DownMirrored
case .UpMirrored:
newOrient = .Down
case .Down:
newOrient = .UpMirrored
case .DownMirrored:
newOrient = .Up
case .Left:
newOrient = .LeftMirrored
case .LeftMirrored:
newOrient = .Left
case .Right:
newOrient = .RightMirrored
case .RightMirrored:
newOrient = .Right
}
return UIImage(CGImage: im.CGImage, scale: im.scale, orientation: newOrient)
}
水平翻转(y轴反射)
func flipH(im:UIImage)->UIImage {
var newOrient:UIImageOrientation
switch im.imageOrientation {
case .Up:
newOrient = .UpMirrored
case .UpMirrored:
newOrient = .Up
case .Down:
newOrient = .DownMirrored
case .DownMirrored:
newOrient = .Down
case .Left:
newOrient = .RightMirrored
case .LeftMirrored:
newOrient = .Right
case .Right:
newOrient = .LeftMirrored
case .RightMirrored:
newOrient = .Left
}
return UIImage(CGImage: im.CGImage, scale: im.scale, orientation: newOrient)
}
答案 4 :(得分:-1)
Swift 3版本:
func flipV(im:UIImage)->UIImage {
var newOrient:UIImageOrientation
switch im.imageOrientation {
case .up:
newOrient = .downMirrored
case .upMirrored:
newOrient = .down
case .down:
newOrient = .upMirrored
case .downMirrored:
newOrient = .up
case .left:
newOrient = .leftMirrored
case .leftMirrored:
newOrient = .left
case .right:
newOrient = .rightMirrored
case .rightMirrored:
newOrient = .right
}
return UIImage(cgImage: im.cgImage!, scale: im.scale, orientation: newOrient)
}
func flipH(im:UIImage)->UIImage {
var newOrient:UIImageOrientation
switch im.imageOrientation {
case .up:
newOrient = .upMirrored
case .upMirrored:
newOrient = .up
case .down:
newOrient = .downMirrored
case .downMirrored:
newOrient = .down
case .left:
newOrient = .rightMirrored
case .leftMirrored:
newOrient = .right
case .right:
newOrient = .leftMirrored
case .rightMirrored:
newOrient = .left
}
return UIImage(cgImage: im.cgImage!, scale: im.scale, orientation: newOrient)
}