为了账号安全,请及时绑定邮箱和手机立即绑定

如何旋转UIImage 90度?

如何旋转UIImage 90度?

牛魔王的故事 2019-07-02 15:53:54
如何旋转UIImage 90度?我有一个UIImage那是UIImageOrientationUp(肖像)我想逆时针旋转90度(对景观)。我不想用CGAffineTransform..我要的像素UIImage移动位置。我使用的代码块(如下所示)最初是为了调整UIImage做这件事。我将目标大小设置为UIImage但我有个错误:(错误):CGBitmapContextCreate:无效的数据字节/行:对于8个整数位/组件、3个组件、kCGImageAlphaPreMultiiedLast.应当至少为1708。(当我提供一个较小的大小作为目标大小BTW时,我不会收到错误)。如何旋转我的UIImage90度CCW只使用核心图形功能,同时保持当前大小?-(UIImage*)reverseImageByScalingToSize:(CGSize)targetSize:(UIImage*)anImage{     UIImage* sourceImage = anImage;      CGFloat targetWidth = targetSize.height;     CGFloat targetHeight = targetSize.width;     CGImageRef imageRef = [sourceImage CGImage];     CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);     CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);     if (bitmapInfo == kCGImageAlphaNone) {         bitmapInfo = kCGImageAlphaNoneSkipLast;     }     CGContextRef bitmap;     if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) {         bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef),          CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);     } else {         bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef),          CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);     }            if (sourceImage.imageOrientation == UIImageOrientationRight) {         CGContextRotateCTM (bitmap, radians(90));         CGContextTranslateCTM (bitmap, 0, -targetHeight);     } else if (sourceImage.imageOrientation == UIImageOrientationLeft) {         CGContextRotateCTM (bitmap, radians(-90));         CGContextTranslateCTM (bitmap, -targetWidth, 0);     } else if (sourceImage.imageOrientation == UIImageOrientationDown) {         // NOTHING     } else if (sourceImage.imageOrientation == UIImageOrientationUp) {         CGContextRotateCTM (bitmap, radians(90));         CGContextTranslateCTM (bitmap, 0, -targetHeight);     }  }
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

比如:

static inline double radians (double degrees) {return degrees * M_PI/180;}UIImage* rotate(UIImage* src, UIImageOrientation orientation){
    UIGraphicsBeginImageContext(src.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orientation == UIImageOrientationRight) {
        CGContextRotateCTM (context, radians(90));
    } else if (orientation == UIImageOrientationLeft) {
        CGContextRotateCTM (context, radians(-90));
    } else if (orientation == UIImageOrientationDown) {
        // NOTHING
    } else if (orientation == UIImageOrientationUp) {
        CGContextRotateCTM (context, radians(90));
    }

    [src drawAtPoint:CGPointMake(0, 0)];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;}


查看完整回答
反对 回复 2019-07-02
?
忽然笑

TA贡献1806条经验 获得超5个赞

我认为最简单的方法(也是线程安全)是这样做:

//assume that the image is loaded in landscape mode from diskUIImage * landscapeImage = [UIImage imageNamed:imgname];
UIImage * portraitImage = [[UIImage alloc] initWithCGImage: landscapeImage.CGImage
                                                     scale: 1.0
                                               orientation: UIImageOrientationRight];

注:AS脑器说,这只是修改图像的方向数据-像素数据是未被触及的。对于某些应用程序来说,这可能还不够。

或者在SWIFT:

let portraitImage  : UIImage = UIImage(CGImage: landscapeImage.CGImage ,
            scale: 1.0 ,
            orientation: UIImageOrientation.Right)


查看完整回答
反对 回复 2019-07-02
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

请查看HardyMacia的简单和令人敬畏的代码:切割缩放旋转图像

打电话

UIImage *rotatedImage = [originalImage imageRotatedByDegrees:90.0];

谢谢Hardy Macia!

标题:

  • (UIImage*)ImageAtRect:(CGRect)RECT;

  • (UIImage*)imageByScalingProportionallyToMinimumSize:(CGSize)targetSize;)

  • (UIImage*)imageByScalingProportionallyToSize:(CGSize)targetSize;)

  • (UIImage*)ImageByScalingToSize:(CGSize)Target Size;

  • (UIImage*)ImageRotatedByRadians:(CGFloat)弧度;

  • (UIImage*)ImageRotatedByDegrees:(CGFloat)度;

由于链接可能会失效,下面是完整的代码

////  UIImage-Extensions.h////  Created by Hardy Macia on 7/1/09.//  Copyright 2009 Catamount Software. All rights reserved.
//#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interface UIImage (CS_Extensions)- (UIImage *)imageAtRect:(CGRect)rect;
- (UIImage *)imageByScalingProportionallyToMinimumSize:(CGSize)targetSize;- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
- (UIImage *)imageByScalingToSize:(CGSize)targetSize;- (UIImage *)imageRotatedByRadians:(CGFloat)radians;- (UIImage *)imageRotatedByDegrees:
(CGFloat)degrees;@end;////  UIImage-Extensions.m////  Created by Hardy Macia on 7/1/09.
//  Copyright 2009 Catamount Software. All rights reserved.//#import "UIImage-Extensions.h"CGFloat DegreesToRadians(CGFloat degrees) 
{return degrees * M_PI / 180;};CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180/M_PI;};@implementation UIImage (CS_Extensions)
-(UIImage *)imageAtRect:(CGRect)rect{

   CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], rect);
   UIImage* subImage = [UIImage imageWithCGImage: imageRef];
   CGImageRelease(imageRef);

   return subImage;}- (UIImage *)imageByScalingProportionallyToMinimumSize:(CGSize)targetSize {

   UIImage *sourceImage = self;
   UIImage *newImage = nil;

   CGSize imageSize = sourceImage.size;
   CGFloat width = imageSize.width;
   CGFloat height = imageSize.height;

   CGFloat targetWidth = targetSize.width;
   CGFloat targetHeight = targetSize.height;

   CGFloat scaleFactor = 0.0;
   CGFloat scaledWidth = targetWidth;
   CGFloat scaledHeight = targetHeight;

   CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

   if (CGSizeEqualToSize(imageSize, targetSize) == NO) {

      CGFloat widthFactor = targetWidth / width;
      CGFloat heightFactor = targetHeight / height;

      if (widthFactor > heightFactor) 
         scaleFactor = widthFactor;
      else
         scaleFactor = heightFactor;

      scaledWidth  = width * scaleFactor;
      scaledHeight = height * scaleFactor;

      // center the image

      if (widthFactor > heightFactor) {
         thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
      } else if (widthFactor < heightFactor) {
         thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
      }
   }


   // this is actually the interesting part:

   UIGraphicsBeginImageContext(targetSize);

   CGRect thumbnailRect = CGRectZero;
   thumbnailRect.origin = thumbnailPoint;
   thumbnailRect.size.width  = scaledWidth;
   thumbnailRect.size.height = scaledHeight;

   [sourceImage drawInRect:thumbnailRect];

   newImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   if(newImage == nil) NSLog(@"could not scale image");


   return newImage ;}- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize {

   UIImage *sourceImage = self;
   UIImage *newImage = nil;

   CGSize imageSize = sourceImage.size;
   CGFloat width = imageSize.width;
   CGFloat height = imageSize.height;

   CGFloat targetWidth = targetSize.width;
   CGFloat targetHeight = targetSize.height;

   CGFloat scaleFactor = 0.0;
   CGFloat scaledWidth = targetWidth;
   CGFloat scaledHeight = targetHeight;

   CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

   if (CGSizeEqualToSize(imageSize, targetSize) == NO) {

      CGFloat widthFactor = targetWidth / width;
      CGFloat heightFactor = targetHeight / height;

      if (widthFactor < heightFactor) 
         scaleFactor = widthFactor;
      else
         scaleFactor = heightFactor;

      scaledWidth  = width * scaleFactor;
      scaledHeight = height * scaleFactor;

      // center the image

      if (widthFactor < heightFactor) {
         thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
      } else if (widthFactor > heightFactor) {
         thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
      }
   }


   // this is actually the interesting part:

   UIGraphicsBeginImageContext(targetSize);

   CGRect thumbnailRect = CGRectZero;
   thumbnailRect.origin = thumbnailPoint;
   thumbnailRect.size.width  = scaledWidth;
   thumbnailRect.size.height = scaledHeight;

   [sourceImage drawInRect:thumbnailRect];

   newImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   if(newImage == nil) NSLog(@"could not scale image");


   return newImage ;}- (UIImage *)imageByScalingToSize:(CGSize)targetSize {

   UIImage *sourceImage = self;
   UIImage *newImage = nil;

   //   CGSize imageSize = sourceImage.size;
   //   CGFloat width = imageSize.width;
   //   CGFloat height = imageSize.height;

   CGFloat targetWidth = targetSize.width;
   CGFloat targetHeight = targetSize.height;

   //   CGFloat scaleFactor = 0.0;
   CGFloat scaledWidth = targetWidth;
   CGFloat scaledHeight = targetHeight;

   CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

   // this is actually the interesting part:

   UIGraphicsBeginImageContext(targetSize);

   CGRect thumbnailRect = CGRectZero;
   thumbnailRect.origin = thumbnailPoint;
   thumbnailRect.size.width  = scaledWidth;
   thumbnailRect.size.height = scaledHeight;

   [sourceImage drawInRect:thumbnailRect];

   newImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   if(newImage == nil) NSLog(@"could not scale image");


   return newImage ;}- (UIImage *)imageRotatedByRadians:(CGFloat)radians{
   return [self imageRotatedByDegrees:RadiansToDegrees(radians)];}- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees 
{   
   // calculate the size of the rotated view's containing box for our drawing space
   UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
   CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
   rotatedViewBox.transform = t;
   CGSize rotatedSize = rotatedViewBox.frame.size;
   [rotatedViewBox release];

   // Create the bitmap context
   UIGraphicsBeginImageContext(rotatedSize);
   CGContextRef bitmap = UIGraphicsGetCurrentContext();

   // Move the origin to the middle of the image so we will rotate and scale around the center.
   CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);

   //   // Rotate the image context
   CGContextRotateCTM(bitmap, DegreesToRadians(degrees));

   // Now, draw the rotated/scaled image into the context
   CGContextScaleCTM(bitmap, 1.0, -1.0);
   CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);

   UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();
   return newImage;}@end;

分享


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 1251 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信