Дефект изображения с помощью ScriptIntrinsicBlur из библиотеки поддержки
Я пытаюсь размыть изображение с помощью ScriptIntrinsicBlur из библиотеки поддержки RenderScript. Я использую gradle, и я использовал этот подход для использования версии библиотеки поддержки RenderScript.
На моем Nexus 4 все работает отлично и очень быстро, но когда я пробую его на своем Samsung Galaxy S с Android 2.3.3, изображение, которое я получаю, выглядит следующим образом:
![noisy image]()
Я использую совет Roman Nurik для того, чтобы ширина битмапа была кратной 4, но я не думаю, что это является причиной моей проблемы. Мой код размытия выглядит так, как в этом сообщении. Спасибо за любой совет.
Здесь мой код:
Получение растрового изображения в представлении и масштабирование растрового изображения:
public static Bitmap loadBitmapFromView(View v) {
v.setDrawingCacheEnabled(false);
v.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_LOW);
v.setDrawingCacheEnabled(true);
Bitmap b = v.getDrawingCache();
return b;
}
public static Bitmap scaledBitmap(Bitmap dest, float scale) {
int scaledWidth = (int) (scale * dest.getWidth());
if (scaledWidth % 4 != 0) { //workaround for bug explained here https://plus.google.com/+RomanNurik/posts/TLkVQC3M6jW
scaledWidth = (scaledWidth / 4) * 4;
}
return Bitmap.createScaledBitmap(dest, scaledWidth, (int) (scale * dest.getHeight()), true);
}
Код Renderscript:
Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
final RenderScript rs = RenderScript.create(context);
final Allocation input = Allocation.createFromBitmap(rs, sentBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(radius);
script.setInput(input);
script.forEach(output);
output.copyTo(bitmap);
return bitmap;
Я заметил эту ошибку в выходе logcat:
E/RenderScript_jni: Нет методов GC
После этого мое приложение заморожено.
Ответы
Ответ 1
Я получал очень похожее изображение из ScriptInstinsicBlur в своем приложении. Понадобилось время, чтобы понять это, но оказывается, что методы getMrameAt MediaMetadataRetiever возвращают конфигурацию Bitmap, которая является RGB_565. Применение размытия в renderscript дает вам забавные результаты, потому что, по-видимому, он не работает на 565 пикселей.
Преобразование моего растрового изображения в ARGB_8888, а затем передача его в renderscript дало мне размытие, которое я искал.
Надеюсь, это поможет кому-то другому.
Это метод, который я нашел для его преобразования. (Это из сообщения SO, которое я не добавил в закладки)
private Bitmap RGB565toARGB888(Bitmap img) {
int numPixels = img.getWidth()* img.getHeight();
int[] pixels = new int[numPixels];
//Get JPEG pixels. Each int is the color values for one pixel.
img.getPixels(pixels, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
//Create a Bitmap of the appropriate format.
Bitmap result = Bitmap.createBitmap(img.getWidth(), img.getHeight(), Bitmap.Config.ARGB_8888);
//Set RGB pixels.
result.setPixels(pixels, 0, result.getWidth(), 0, 0, result.getWidth(), result.getHeight());
return result;
}