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();
}
}
});
}
}
Решение
Пожалуйста, обратитесь к Ответ Ромена ниже.
Я хотел бы удалить этот ответ, но я не могу, так как он помечен как принятый.
Обратите внимание, что 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
Надеюсь это поможет.
У меня была похожая проблема, и вот что я сделал: Проблемы с качеством при изменении размера изображения во время выполнения
Кроме того, если ваша функция изменения размера не соответствует соотношению сторон изображения, качество влияет. Вы можете найти немного алгоритма изменения размера в Интернете, например, Проверь это