Как я могу отображать масштабированные изображения без потери четкости?

#android #image-scaling #android-imageview

#Android #масштабирование изображения #android-imageview

Вопрос:

Я должен отображать небольшие миниатюры изображений для моего ListView с полным изображением на экране сведений.

Я использую одно и то же изображение для двух макетов. Вот мой элемент списка <ImageView> :

 <ImageView android:layout_height="50dip"                             
    android:layout_width="50dip" 
    android:id="@ id/item_view_img" 
    android:scaleType="fitXY">
</ImageView>
  

Вот мой подробный вид <ImageView> :

 <ImageView android:id="@ id/update_details_img"
    android:layout_width="289dip" android:layout_height="206dip"
    android:src="@drawable/q_silhouette" android:paddingTop="10dp"
    android:scaleType="fitXY" android:gravity="center">                                     
</ImageView>
  

Исходный размер изображения составляет около 300×360. Ни одно из моих изображений не выглядит хорошо.
Как я могу отображать эти изображения без потери четкости?

Ответ №1:

Этот вопрос относится не столько к Android, сколько к 2D-графике. В настоящее время существует множество графических гуру, пытающихся решить именно ту проблему, с которой вы столкнулись.

Невозможно изменить размеры изображения без потери точности оригинала. Проблема на самом деле заключается в том, приводит ли эта потеря точности к потере четкости. Чаще всего ответ заключается в том, что по мере снижения точности снижается и четкость. Однако есть много способов смягчить это.

Как общее эмпирическое правило, вы можете уменьшить размер изображения примерно до 1/2 исходного размера без артефактов. После этого вы часто можете уменьшить размер еще раз в зависимости от сложности изображения (количества цветов).

В качестве альтернативы вы можете увеличить размер изображения примерно до 1,75 размера оригинала. Вы почти никогда не сможете обмануть систему, снова увеличив размер.

Однако все ставки отменяются, если вы измените соотношение сторон. Это потому, что это искажает изображение другими способами. В Android вы можете избежать изменения соотношения сторон в XML, установив для scaleType атрибута значение centerInside . Это значительно поможет и сохранит изображение в рамках. Особенно это следует делать для миниатюр ImageView , если только вы не собираетесь устанавливать для них то же соотношение сторон, что и для подробных ImageView .

Комментарии:

1. Привет @Fuzzical Logic, я добавил centerInside в свой <ImageView> . но изображение не отображается в указанной ширине (289 точек), высоте (206 точек).. он отображается очень маленьким… <ImageView android:id="@ id/update_details_img" android:layout_width="289dip" android:layout_height="206dip" android:src="@drawable/q_silhouette" android:paddingTop="10dp" android:scaleType="centerInside" android:gravity="center"> </ImageView>

2. Тем не менее, теоретически 300 x 360? Каков фактический размер, который отображается? Вы можете это получить?

3. на этот раз фактический размер моего изображения составляет 800×600 .. все еще он отображается в небольшом размере.. даже при использовании android:layout_width="800dip" android:layout_height="600dip" в моем макете .. размер поля увеличивается, но изображение по-прежнему отображается очень маленьким. кажется, что это 50×50.

4. При 800 x 600 ваш 50x50dip сделает его очень маленьким. У вашего 289×206 должны быть верхние и нижние поля, но они должны быть удобными для просмотра. Здесь происходит что-то еще. Проблема не в «центральной части», а в чем-то другом, связанном с изображением. centerInside просто сжимает изображение в соответствии с наименьшим относительным размером контейнера.

5. Если отображается ваш эскиз размером 50×50, то вы должны использовать ссылку на скорректированное изображение размером 50×50, а не перезагружать изображение с новыми размерами. Вам придется взглянуть на код.

Ответ №2:

Поскольку вы меняете соотношения с этими разными представлениями изображений, вы можете захотеть масштабировать с помощью centerInside или centerCrop .