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

StackOverflow https://stackoverflow.com/questions/2041207

Вопрос

Я хочу показать изображения с использованием метода 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();
                }
            }
        });
    }
}
Это было полезно?

Решение

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

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


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

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

Другие советы

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

Проверить http://developer.android.com/reference/android/graphics/bitmapfactory.options.html (Использоваться с unscaledbitmap = bitmapfactory.decodestream (in);

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

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

Следовательно, поскольку API -уровень 12 есть метод (в растровом карте класса)

setHasAlpha(boolean value);

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top