Android - масштабирование изображения после того, как я это сделал программно - PullRequest
1 голос
/ 25 января 2011

Странная вещь происходит - по крайней мере, я не понимаю.

У меня есть изображение (w: 120px, h: 63px), которое представлено на одной ImageButton.Единственный вариант этого изображения, который у меня есть, помещен в drawable-hdpi (и другого каталога для рисования нет).Все в порядке с этим изображением и каждым разрешением (плотностью), Android очень хорошо позаботится о нем.

Но проблема в том, что я беру фотографию из альбома (например, очень большое фото), масштабэто размеры кнопки (ранее упоминалось, w: 120px h: 63px) и установите это маленькое изображение в качестве фона ImageButton.

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

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

Любая подсказка будет высоко оценена.

Вот код, который я использую для изменения размера изображения:

public static void resizeAndSaveImage(String pathToResize, int newWidth, int newHeight, FileOutputStream output) {
try {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 8;
    Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(pathToResize), null, options);
    if (bitmap != null) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
        output.close();
    }
} catch (Exception e) {
    // ...
}

Параметры измерения передаются следующим образом: newWidth = 120, newHeight = 63.

1 Ответ

1 голос
/ 25 января 2011

Чтобы добиться желаемого, вам нужно использовать независимые от плотности пиксели (dp), а не физические пиксели. Чтение из здесь :

Плотность-независимый пиксель эквивалентно одному физическому пикселю на Экран 160 dpi, базовая плотность предполагается платформой (как описано позже в этом документе). Во время выполнения, платформа прозрачно обрабатывает любые масштабирование необходимых единиц дп, на основе на фактическую плотность экрана в использовать. Преобразование дп единиц в пиксели экрана просты: пиксели = dps * (плотность / 160). Например, на экране с разрешением 240 dpi 1 dp будет равно 1,5 физические пиксели. Использование дп единиц для определить интерфейс вашего приложения очень рекомендуется, как способ обеспечения правильное отображение вашего интерфейса на разных экраны.

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

...