2016-07-28 9 views
0

Я хочу изменить размер UIImage, поэтому я использовал ниже код.Изменение ориентации UII при рисовании в UIGraphicsBeginImageContext

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 результат после того, как изменить размер изображения.

Я тоже пробовал код. Но все же это дает мне противоположную ориентацию.

+0

Ekata попробовать другое решение – user3182143

+0

Возможный дубликат [ориентация UIImage меняется при рисовании в UIGraphicsBeginImageContext] (http://stackoverflow.com/questions/24283017/uiimage-orientation-is-changing-when-drawing-in-igigraphicsbeginimagecontext) – fishinear

+0

@fishinear Я использовал этот код но это не сработало, вот почему я задал этот вопрос. –

ответ

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(); 
+0

Спасибо за ответ. Позвольте мне попробовать это решение. –

+0

Не могли бы вы объяснить мне «captureFrame»? Нужно передать кадр исходного изображения? –

+0

Да передайте его исходной кадре – user3182143

0

Там нет необходимости устанавливать orientationMode для конечного изображения. orientationMode является индикатором поворота изображения при его рисовании. То есть, UIImage содержит исходные, невращенные данные (обычно в формате CGImage) и свойство orientationMode. При рисовании UIImage (например, при добавлении его к UIImageView) он также будет вращать его, если необходимо.

Ваш код также нанесения изображения, и, следовательно, будет вращать его:

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

destImage будет содержать развернутое исходные данные, и orientationModeUIImageOrientationUp. В результате получается, что рисунок 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; 
} 
+0

Ok Спасибо. Дай мне попробовать. –