Android: качество изображений, измененных во время выполнения - PullRequest
13 голосов
/ 11 января 2010

Я хочу показать изображения, используя метод drawBitmap (). Но прежде чем я хочу изменить его размер в соответствии с размерами экрана. У меня проблема с качеством изображения. Вы можете увидеть скриншоты и тестовый код ниже. Как я могу изменить размер изображения во время выполнения с хорошим качеством?

Спасибо за решения.

Исходное изображение: альтернативный текст http://dl.dropbox.com/u/709109/gradient.png

Результат скриншота на устройстве: альтернативный текст http://dl.dropbox.com/u/709109/device.png

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

import java.io.IOException;
import java.io.InputStream;

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LinearLayout container = (LinearLayout) findViewById(R.id.container);
        container.addView(new View(this) {
            @Override
            protected void onDraw(Canvas canvas) {
                Bitmap unscaledBitmap;
                try {
                    InputStream in = getAssets().open("images/gradient.png");
                    unscaledBitmap = BitmapFactory.decodeStream(in);
                    in.close();
                    canvas.drawBitmap(unscaledBitmap, null, new Rect(0, 0, 320, 480), null);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Ответы [ 6 ]

15 голосов
/ 11 января 2010

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

10 голосов
/ 11 января 2010

Пожалуйста, обратитесь к ответу Ромена ниже.

Я хотел бы удалить этот ответ, но не могу, поскольку он помечен как принятый.


Обратите внимание, что Android [когда этот ответ был изначально написан без явного запроса 32-битного цвета] будет выполнять только 16-битный цвет, поэтому могут быть случаи, когда вы получаете нежелательные артефакты.

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

2 голосов
/ 11 января 2010

Проверить http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html (Для использования с unscaledBitmap = BitmapFactory.decodeStream (in);

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

1 голос
/ 30 августа 2012

Реализации метода createScaledBitmap (..) на старых платформах (уровень API <12) вызывают проблемы, когда вы пытаетесь масштабировать растровое изображение ARGB_8888, у которого нет фактического значения альфа (т. Е. Каждый пиксель имеет альфа = 255), потому что их hasAlpha флаг установлен в ложь. В этом случае масштабированное растровое изображение автоматически преобразуется в формат RGB_565. </p>

Поэтому, начиная с уровня API 12, существует метод (в классе Bitmap)

setHasAlpha(boolean value);

Что помогает предотвратить преобразование при использовании createScaledBitmap (..).

Существует способ использовать тот же метод на уровне API> 3. Он существует очень давно, просто скрыт. Все необходимые шаги, включая исходный код, описаны здесь:

https://stackoverflow.com/a/12202069/1082933

Надеюсь, это поможет.

0 голосов
/ 23 ноября 2010
0 голосов
/ 11 января 2010

Кроме того, если ваша функция изменения размера не учитывает соотношение сторон изображения, это влияет на качество. Вы можете найти некоторый алгоритм изменения размера в сети, например проверить это

...