在UIGraphicsBeginImageContext中绘制时,UIImage方向已更改

时间:2016-07-28 13:04:00

标签: objective-c uiimage image-resizing uigraphicscontext

我想调整UIImage的大小,所以我使用下面的代码。

UIGraphicsBeginImageContext(size);
[sourceImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *destImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

上面的代码工作正常,但destImage的方向已改变。我不知道怎么回事。

source.imageOrientation = 3
destImage.imageOrientation = 0

任何人都可以告诉我如何调整与sourceImage方向相同的图像吗?

编辑:

UIImage *scaleImage = [UIImage imageWithCGImage:destImage.CGImage
                                scale:sourceImage.scale orientation:sourceImage.imageOrientation];

编辑:

我在调整图像大小后得到this结果。

我也试过上面的代码。但它仍然给我相反的方向。

2 个答案:

答案 0 :(得分:1)

无需为目标图像设置orientationModeorientationMode表示在绘制图像时如何旋转图像。也就是说,UIImage包含原始的,未旋转的数据(通常为CGImage格式)和orientationMode属性。在绘制UIImage时(例如将其添加到UIImageView时),它会根据需要旋转它。

您的代码也在绘制图像,因此会将其旋转:

[sourceImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *destImage = UIGraphicsGetImageFromCurrentImageContext();

destImage将包含已轮换的原始数据,orientationMode UIImageOrientationUp。最终结果是,绘制destImage将产生与sourceImage具有相同方向的相同图像。

唯一的区别在于您实际使用每个CGImage原始数据(因此忽略orientationMode属性),然后目标图像将是源的旋转版本。如果您打算使用CGImage,那么最好使用CGImage级操作来调整图片大小(例如,这来自http://fingertwister.tumblr.com/post/9074775714/code-to-create-a-resized-cgimage-from-a-cgimage,我没有验证它):

+ (CGImageRef)resizeCGImage:(CGImageRef)image toWidth:(int)width andHeight:(int)height {
    // create context, keeping original image properties
    CGColorSpaceRef colorspace = CGImageGetColorSpace(image);
    CGContextRef context = CGBitmapContextCreate(NULL, width, height,
        CGImageGetBitsPerComponent(image),
        CGImageGetBytesPerRow(image),
        colorspace,
        CGImageGetAlphaInfo(image));
    CGColorSpaceRelease(colorspace);

    if(context == NULL)
        return nil;

    // draw image to context (resizing it)
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
    // extract resulting image from context
    CGImageRef imgRef = CGBitmapContextCreateImage(context);
    CGContextRelease(context);

    return imgRef;
}

答案 1 :(得分:0)

调整imageView的大小

CALayer *layer;
layer=self.view.layer;
UIGraphicsBeginImageContext(self.view.bounds.size);
CGContextClipToRect (UIGraphicsGetCurrentContext(),captureFrame); //Give your frame of image here(x,y,width,height)
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

还可以尝试以下代码

UIGraphicsBeginImageContext(self.frame.size);
[drawImage.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
CGContextStrokePath(UIGraphicsGetCurrentContext());
CGContextFlush(UIGraphicsGetCurrentContext());
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();