Изменение размера UIImage (пропорция шкалы)

Возможный дубликат:
Изменить размер UIImage с соотношением сторон?

Следующий fragment кода идеально изменяет размер изображения, но проблема в том, что он искажает соотношение сторон (в результате получается искаженное изображение). Любые указатели?

// Change image resolution (auto-resize to fit) + (UIImage *)scaleImage:(UIImage*)image toResolution:(int)resolution { CGImageRef imgRef = [image CGImage]; CGFloat width = CGImageGetWidth(imgRef); CGFloat height = CGImageGetHeight(imgRef); CGRect bounds = CGRectMake(0, 0, width, height); //if already at the minimum resolution, return the orginal image, otherwise scale if (width <= resolution && height  1) { bounds.size.width = resolution; bounds.size.height = bounds.size.width / ratio; } else { bounds.size.height = resolution; bounds.size.width = bounds.size.height * ratio; } } UIGraphicsBeginImageContext(bounds.size); [image drawInRect:CGRectMake(0.0, 0.0, bounds.size.width, bounds.size.height)]; UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return imageCopy; } 

Я использовал эту единственную строку кода для создания нового UIImage, который масштабируется. Задайте параметры масштаба и ориентации для достижения желаемого. Первая строка кода просто захватывает изображение.

  // grab the original image UIImage *originalImage = [UIImage imageNamed:@"myImage.png"]; // scaling set to 2.0 makes the image 1/2 the size. UIImage *scaledImage = [UIImage imageWithCGImage:[originalImage CGImage] scale:(originalImage.scale * 2.0) orientation:(originalImage.imageOrientation)]; 

Это не проблема. вещь, которую вы получили, чтобы найти пропорциональную ширину и высоту

например, если размер составляет 2048,0 x 1360,0, размер которого должен быть изменен до 320 x 480, тогда результирующий размер изображения должен быть 722,0 x 480,0

 here is the formulae to do that . if w,h is original and x,y are resulting image. w/h=x/y => x=(w/h)*y; submitting w=2048,h=1360,y=480 => x=722.0 ( here width>height. if height>width then consider x to be 320 and calculate y) в here is the formulae to do that . if w,h is original and x,y are resulting image. w/h=x/y => x=(w/h)*y; submitting w=2048,h=1360,y=480 => x=722.0 ( here width>height. if height>width then consider x to be 320 and calculate y) 

U можно отправить на этой веб-странице. ARC

Смущенный ? хорошо, вот категория для UIImage, которая сделает для вас это.

 @interface UIImage (UIImageFunctions) - (UIImage *) scaleToSize: (CGSize)size; - (UIImage *) scaleProportionalToSize: (CGSize)size; @end @implementation UIImage (UIImageFunctions) - (UIImage *) scaleToSize: (CGSize)size { // Scalling selected image to targeted size CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); CGContextClearRect(context, CGRectMake(0, 0, size.width, size.height)); if(self.imageOrientation == UIImageOrientationRight) { CGContextRotateCTM(context, -M_PI_2); CGContextTranslateCTM(context, -size.height, 0.0f); CGContextDrawImage(context, CGRectMake(0, 0, size.height, size.width), self.CGImage); } else CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), self.CGImage); CGImageRef scaledImage=CGBitmapContextCreateImage(context); CGColorSpaceRelease(colorSpace); CGContextRelease(context); UIImage *image = [UIImage imageWithCGImage: scaledImage]; CGImageRelease(scaledImage); return image; } - (UIImage *) scaleProportionalToSize: (CGSize)size1 { if(self.size.width>self.size.height) { NSLog(@"LandScape"); size1=CGSizeMake((self.size.width/self.size.height)*size1.height,size1.height); } else { NSLog(@"Potrait"); size1=CGSizeMake(size1.width,(self.size.height/self.size.width)*size1.width); } return [self scaleToSize:size1]; } @end 

– для вызова соответствующего вызова необходимо следующее: img – экземпляр UIImage.

img = [img scaleProportionalToSize: CGSizeMake (320, 480)];

Это фиксирует математическую шкалу с максимальным размером как по ширине, так и по высоте, а не только по одному в зависимости от ширины и высоты оригинала.

 - (UIImage *) scaleProportionalToSize: (CGSize)size { float widthRatio = size.width/self.size.width; float heightRatio = size.height/self.size.height; if(widthRatio > heightRatio) { size=CGSizeMake(self.size.width*heightRatio,self.size.height*heightRatio); } else { size=CGSizeMake(self.size.width*widthRatio,self.size.height*widthRatio); } return [self scaleToSize:size]; } 

Это изменилось для меня:

 // The size returned by CGImageGetWidth(imgRef) & CGImageGetHeight(imgRef) is incorrect as it doesn't respect the image orientation! // CGImageRef imgRef = [image CGImage]; // CGFloat width = CGImageGetWidth(imgRef); // CGFloat height = CGImageGetHeight(imgRef); // // This returns the actual width and height of the photo (and hence solves the problem CGFloat width = image.size.width; CGFloat height = image.size.height; CGRect bounds = CGRectMake(0, 0, width, height); 

Попробуйте сделать целочисленное значение bounds .

 #include  .... if (ratio > 1) { bounds.size.width = resolution; bounds.size.height = round(bounds.size.width / ratio); } else { bounds.size.height = resolution; bounds.size.width = round(bounds.size.height * ratio); } 
  • Как сравнить один образ с другим, чтобы увидеть, похожи ли они на определенный процент, на iPhone?
  • Сохранение выбранного изображения в CoreData
  • UIImage Сохранение изображения с именем файла на iPhone
  • Как увеличить / уменьшить объект UIImage, когда пользователь зажимает экран?
  • Как использовать функцию рисования NSString для создания UIImage из текста
  • Могу ли я загрузить UIImage из URL-адреса?
  • Как перевернуть UIImage горизонтально?
  • Как отобразить изображение base64 в UIImageView?
  • Загрузка изображения через POST в Objective C
  • iOS: изображение поворачивается на 90 gradleусов после сохранения в виде данных представления PNG
  • Как захватить UIView в UIImage без потери качества на дисплее сетчатки
  • Давайте будем гением компьютера.