2014-02-13 2 views
0

Я знаю, что это было задано раньше ... но я думаю, что я делаю все хорошо, но изображение не выглядит хорошо на экране сетчатки. Я слышал, что если нужно отображать UIImage в сетчатке, мне нужно только установить масштаб в 2.0. Но все еще не работает, я не знаю, влияет ли изменение размера и обрезки UIGraphics на качество изображения. обычно я назову свой resizer из setImage внутри пользовательского класса UIImageView (изображение с сервера имеет правильную ширину, но выше, так что предположим, что оно только растёт) в моем контроллере плохо называет это следующим образом:Изменение размера и размещение Retina UIImage с сервера

[customUIImageViewInstance setImage:[UIImage imageWithData:[impreso thumb] scale:isRetina()?2:1]]; 

в моей пользовательской реализации UIImageView:

-(void)setImage:(UIImage *)image{ 
    if (image==nil) { 
     [super setImage:nil]; 
    }else{ 
     [super setImage:[self scaleAnImageAspectFillCropHeight:image withNewWide:self.frame.size.width andNewTall:self.frame.size.height]]; 
    } 
} 



-(UIImage*) scaleAnImageAspectFillCropHeight:(UIImage*) image withNewWide:(NSUInteger) wide andNewTall:(NSUInteger) tall{ 
    if (image.size.width!=wide || image.size.height!=tall){ 
     BOOL retina; 
     if ([image scale]==2) { 
      retina = YES; 
      wide*=2; 
      tall*=2; 
     }else{ 
      retina = NO; 
     } 
     CGFloat width = image.size.width; 
     CGFloat height = image.size.height; 
     CGFloat targetWidth = wide; 
     CGFloat targetHeight = tall; 
     CGFloat scaleFactor = 0.0; 
     CGFloat scaledWidth; 
     CGFloat scaledHeight; 
     CGPoint thumbnailPoint = CGPointMake(0.0,0.0); 

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

    scaleFactor = widthFactor; // the width must be all visible, the height might be cropped but that is the inteded behavior 

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

    // centers X if needed, Y starts in 0 because the top part of the image is important 
    thumbnailPoint.y = 0; 
    if (widthFactor < heightFactor){ 
     thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; 
    } 


    UIGraphicsBeginImageContext(CGSizeMake(wide, tall)); // this will crop 

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

    [image drawInRect:thumbnailRect]; 

    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    if (retina) { 
     newImage = [UIImage imageWithCGImage:newImage.CGImage scale:2 orientation:newImage.imageOrientation]; 
    } 

    if(newImage == nil){ 
     [self setContentMode:UIViewContentModeScaleAspectFit]; 
    }else{ 
     //pop the context to get back to the default 
     UIGraphicsEndImageContext(); 
     return newImage; 
    } 
} 
return image; 
} 

я был отладки ... и это размеры и масштаб являются правильными. Я не знаю, что возится с качеством изображения. Простое объяснение поможет много, thx.

ответ

1

Вы пытались насильно масштабировать любое изображение дважды для отображения сетчатки? Если да, качество изображения не улучшается. Это разумно. Как вы знаете, качество изображения NOT улучшено просто растяжением ширины и высоты.

Что вам действительно нужно сделать, так это использовать изображение с высоким разрешением, которое первоначально было в два раза выше.

+0

конечно, но исходное изображение имеет ширину ширины * = 2; и даже выше, чем высокий * = 2; ... на самом деле не сетчатка должна сделать ее намного меньше. но в любом случае спасибо, я нашел свою ошибку. Это не был подкласс UIImageView ... insead, это был подкласс класса custum, который является подклассом UIImageView, который также имеет свойство setImage: override, поэтому он делал другой тип изменения размера в этом переопределении, что делало странные результаты ... но я даю вам +1 за попытку помочь :) – user2387149

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

  • Нет связанных вопросов^_^