Как правильно уменьшить изображение?
Создавая приложение, которое имеет много высококачественных изображений, яМы решили уменьшить изображение до необходимого размера (это означает, что если изображение больше экрана, я уменьшу его).
Проблема ямы заметили, что на некоторых устройствах, если изображения уменьшены, они становятся размытыми / пикселированными, но на тех же устройствах, для того же целевого размера imageView, если изображения не 'они не очень хорошо выглядят.
Что я'мы пыталисьМы решили проверить эту проблему дальше и создали небольшое POC-приложение, которое показывает проблему.
Прежде чем показывать вам код, здесьдемонстрация того, что яЯ говорю о:
Это'Немного трудно увидеть разницу, но вы можете видеть, что вторая немного пикселирована. это может быть показано на любом изображении.
public class MainActivity extends Activity
{
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView originalImageView=(ImageView)findViewById(R.id.originalImageView);
final ImageView halvedImageView=(ImageView)findViewById(R.id.halvedImageView);
final ImageView halvedBitmapImageView=(ImageView)findViewById(R.id.halvedBitmapImageView);
//
final Bitmap originalBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test);
originalImageView.setImageBitmap(originalBitmap);
halvedImageView.setImageBitmap(originalBitmap);
//
final LayoutParams layoutParams=halvedImageView.getLayoutParams();
layoutParams.width=originalBitmap.getWidth()/2;
layoutParams.height=originalBitmap.getHeight()/2;
halvedImageView.setLayoutParams(layoutParams);
//
final Options options=new Options();
options.inSampleSize=2;
// options.inDither=true; //didn't help
// options.inPreferQualityOverSpeed=true; //didn't help
final Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.test,options);
halvedBitmapImageView.setImageBitmap(bitmap);
}
}
XML:
ВопросПочему это происходит?
Оба метода должны иметь одинаковый результат, так как оба образца взяты из одного источника и используют один и тот же коэффициент.
Я пытался играть с методом понижающей дискретизации, но ничего не помогло.
Использование inDensity (вместо inSampleSize), кажется, исправляет это, но яЯ не уверен, что установить для этого. Я думаю, что для внешних изображений (например, из Интернета) я могу установить плотность экрана, умноженную на размер выборки, который я хочу использовать.
Но это даже хорошее решение? что я должен делать в случае, если изображения находятся внутри папки ресурсов (я неНе думаю, что есть функция, чтобы узнать, в какой папке плотности находится растровое изображение? почему это работает при использовании рекомендуемого способа (говорили оВот) нехорошо работает?
РЕДАКТИРОВАТЬ: Ямы нашли трюк, чтобы узнать, какая плотность используется для рисования, получаемого из ресурсов (ссылка здесь) однако это неt будущее, так как вы должны быть конкретны для определения плотности.