2011-02-01 5 views
3

Каков наилучший способ изменения размера фотографий и создания миниатюрных изображений одинакового размера для фотопотоков? Flickr и Facebook делают это, и мы хотели бы подражать этой функциональности.Изменение размера фотографий в виде эскизов, таких как Flickr и Facebook photostreams?

Вот пример: http://www.flickr.com/photos/alphageek/233472093/

Если посмотреть фотопотоку на правой руке (середина страницы), все миниатюры имеют одинаковый размер, даже если исходные изображения различаются по размеру, и самое главное, эскизы появляются разумно обрезанные.

Flickr способен автоматически обрезать и изменять размер изображения вокруг основного фокуса, в отличие от простого изменения размера изображения до размера миниатюр (например, путем установки ширины и высоты изображения), что приведет к тому, что изображение будет выглядеть скрученным и потерянным фокус изображения.

+0

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

+0

Спасибо, SergeS. Как они делают это программно? – Crashalot

ответ

0

Для таких проблем я всегда использую: http://www.imagemagick.org/script/convert.php.

Imagemagick предоставляет множество функций для обработки изображений. Я беру изображения в цикле и создаю большую версию и миниатюру.

1

они делают изменение размера.

Если вы используете imagemagick для преобразования, это будет # опция, например, «40x40 #» или «90x90 #», где фотография будет изменена, а затем обрезана, чтобы поддерживать соотношение сторон, при этом как можно больше в миниатюре.

программно это, вероятно, выглядит следующим образом:

1) изменить размер изображения таким образом, что, как указано короткая сторона. 2) посередине, так что длинная сторона теперь также указана.

+0

спасибо! есть ли способ сделать это без загрузки imagemagick? – Crashalot

1

Да. Прежде всего, необходимо, чтобы получить новый коэффициент размера сохраняемости аспекта нетронутый:

CGFloat horizontalRatio = newSize.width/oldSize.width; 
CGFloat verticalRatio = newSize.height/oldSize.height; 
CGFloat ratio = MAX(horizontalRatio, verticalRatio); 
CGSize newSize = CGSizeMake(oldSize.width *ratio, newSize.height*ratio) 

Затем вам нужно перерисовывать изображение в новом размере (сам ваше изображение):

UIGraphicsBeginImageContextWithOptions(newSize, YES, 0); 
    [self drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

Затем обрезать до нужного размера :

 CGRect cropRect = CGRectMake ((newImage.size.width - width)/2, (newImage.size.height - height)/2, width, height) 
     UIGraphicsBeginImageContextWithOptions(cropRect.size, YES, 0); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGRect drawRect = CGRectMake(-cropRect.origin.x, -cropRect.origin.y, self.size.width, self.size.height); 
     CGContextClipToRect(context, CGRectMake(0, 0, cropRect.size.width, cropRect.size.height)); 
     [self drawInRect:drawRect]; 
     UIImage* croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
return croppedImage;