2013-03-06 2 views
1

Существует изображение с размером 504x320 и размером изображения 1080x1920, которое больше, чем изображение, я хочу изменить размер этого изображения так же, как и изображение, не изменяя качество и содержание изображения , Я использую этот метод, и это работает хорошо, но этот метод немного урожай с реальным изображениемИзменить размер UIimage перед установкой на изображении

- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize image:(UIImage*)image 
{ 
    UIImage *sourceImage = image; 
    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; // scale to fit height 
     else 
      scaleFactor = heightFactor; // scale to fit width 
     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; 
      } 
    } 

    UIGraphicsBeginImageContext(targetSize); // this will crop 

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

    [sourceImage drawInRect:thumbnailRect]; 

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

    //pop the context to get back to the default 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
+1

Качество и содержимое (из-за масштабирования изображения) будут изменены независимо от того, как вы пытались это сделать? – giorashc

ответ

2

Попробуйте загрузить изображение с помощью его изменения следующим способом.

- (UIImage *)editImage:(UIImage *)_image screenWidth:(CGFloat)_width { 


CGSize imageSize = CGSizeMake(_width, _width); 

if (isRetinaDisplay]) 
    UIGraphicsBeginImageContextWithOptions(imageSize, NO, 2.0); 
else 
    UIGraphicsBeginImageContext(imageSize); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor); 
CGContextFillRect(context, CGRectMake(0.0, 0.0, _width, _width)); 

CGRect imageRect = CGRectMake((_width-_image.size.width)/2, (_width-_image.size.height)/2, _image.size.width, _image.size.height); 

[_image drawInRect:imageRect]; 

UIImage * resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

return resizedImage; 
} 

PS: Не нужно передавать высоту изображения. Основываясь на аспекте, он будет вычисляться внутри.

С наилучшими пожеланиями.

2

Посмотрите на режимы просмотра содержания UIImageView, я думаю, что Aspect Fit является то, что вы хотите

EDIT после downvotes

[_img_view setContentMode:UIViewContentModeScaleAspectFit] 

или

[_img_view setContentMode:UIViewContentModeScaleAspectFill] 

В первом случае может иметь пробелы в т он сверху/снизу или влево/вправо, чтобы сохранить соотношение сторон Последний не будет иметь места, но может быть перекрыт сверху/снизу или слева/справа от вашего изображения.

Не беспокойтесь о создании другого изображения, просто используйте contentMode и установите изображение так, как обычно (т.е. [_img_view setImage:img];)

+0

Если вы не уверены, не отправляйте в качестве ответа. И если вы не ленитесь об этом :) – giorashc

+0

@giorashc вы правы, говоря, что я ленился с моим ответом, однако я верю, что даю правильный ответ, просто не включая код для этого. SO должен быть о том, чтобы давать ответы на вопросы, не обязательно постоянно предлагая образцы кода. –

+1

Высказывание содержания вида/аспекта подходит не очень много и должно быть опубликовано как комментарий imao. тем не менее теперь это выглядит так, как должно быть +1 для вас;) – giorashc

1

Это то, что означает @EdgeAkpinar и должен делать то же, что и ваш метод, только короче.

UIImageView *imageView  = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourImage.png"]] autorelease]; 
imageView.contentMode  = UIViewContentModeScaleAspectFit; 
imageView.frame    = CGRectMake(0, 0, 504, 320); 

Вам не нужны какие-либо изменения в вашем изображении.

+0

, но изображение не очень хорошо выглядит в этом образе изображения – ajeet

+0

Где вы снимаетесь? Если вы, например, используете UIImagePickerController и берете новую фотографию, вы можете установить качество перед сохранением. Насколько я знаю, качество всегда уменьшается при масштабировании изображения. – pmk

Смежные вопросы