Android: качество изображений, измененных во время выполнения

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

Благодарим вас за решения.

Исходное изображение: alt text http://dl.dropbox.com/u/709109/gradient.png

Результат скриншота на устройстве: alt text 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();
                }
            }
        });
    }
}

Ответ 1

Пожалуйста, обратитесь к Romain answer ниже.

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


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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Поэтому, поскольку на уровне API 12 существует метод (в битмапе класса)

setHasAlpha(boolean value);

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

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

fooobar.com/questions/82496/...

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

Ответ 6

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