Дефект изображения с помощью ScriptIntrinsicBlur из библиотеки поддержки

Я пытаюсь размыть изображение с помощью ScriptIntrinsicBlur из библиотеки поддержки RenderScript. Я использую gradle, и я использовал этот подход для использования версии библиотеки поддержки RenderScript.

На моем Nexus 4 все работает отлично и очень быстро, но когда я пробовал его на своем Samsung Galaxy S с Android 2.3.3, картина, которую я получаю, выглядит так:

Шумное изображение

Я использую подсказку Романа Нурика для того, чтобы ширина битмапа была кратной 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

После этого мое приложение заморожено.

Я получал очень похожее изображение из 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; } 
Intereting Posts