Изображение, сохраненное на SD-карте, показывает только черный экран с использованием GPUImageView в Android.

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

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

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

Я не знаю, почему он показывает черное изображение.

Вот код, в котором я сделал GPUImageView as drawingcachedenabled значением true и сохранил его как изображение.

mGPUImageView.setDrawingCacheEnabled(true);
Bitmap bitmap = mGPUImageView.getDrawingCache();
String path = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();
File fil = new File(path + "/MyPics");
fil.mkdir();
Random rand = new Random();
int aa = rand.nextInt();
String filename = "Photo" + aa+".jpg";
File newImg = new File(fil, filename);
    try {
        FileOutputStream out = new FileOutputStream(newImg);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
        out.flush();
        out.close();
    } catch (Exception e) {

}
    Toast.makeText(this,"File Saved at Path---->" + newImg.getAbsolutePath(),
                    Toast.LENGTH_LONG).show();
            mGPUImageView.setDrawingCacheEnabled(false);

Пожалуйста, помогите мне решить проблему.


person GrIsHu    schedule 26.03.2014    source источник
comment
Вы можете напрямую получить Bitmap эффектов из GpuImage.getBitmapWithFilterApplied(final Bitmap Bitmap), а не из SurfaceView.   -  person kalyan pvs    schedule 26.03.2014
comment
GLSurfaceView сильно отличается от обычного View. Таким образом, вы не можете получить содержимое GLSurfaceView с помощью getDrawingcache(), так как все рендерится на GLSurfaceView с использованием графического процессора. и этот ответ может вам помочь.. .   -  person Gopal Gopi    schedule 26.03.2014
comment
Почему вы не используете saveToPictures() метод GPUImageView.java?? Есть ли проблема??   -  person user370305    schedule 26.03.2014
comment
@ user370305 Я уже пробовал это, но у меня это не работает.   -  person GrIsHu    schedule 26.03.2014
comment
Какие проблемы? Вы видели какой-нибудь журнал от GPUImageView в logcat?   -  person user370305    schedule 26.03.2014
comment
У меня не возникло никаких проблем. Но он запрашивает реализацию Listener OnPictureSavedListener, и слушатель хочет получить Uri изображения, которое мне передать невозможно.   -  person GrIsHu    schedule 26.03.2014
comment
Хорошо, вызовите public Bitmap getBitmapWithFilterApplied() этот метод GPUImage.java. Он вернет эффект, примененный к текущему растровому изображению, и использует хранилище Bitmap Factory в Sdcard.   -  person user370305    schedule 26.03.2014
comment
Я предполагаю, что вы добавили GPUImage источник библиотеки в свой проект.   -  person user370305    schedule 26.03.2014
comment
Да, добавлен @user370305   -  person GrIsHu    schedule 26.03.2014
comment
Хорошо, попробуйте мой комментарий выше и дайте мне знать, что произойдет. Поскольку GPUImage код библиотеки протестирован и работает нормально.   -  person user370305    schedule 26.03.2014
comment
Но я использовал класс GPUImageView, а не GPUImage.   -  person GrIsHu    schedule 26.03.2014
comment
@GrIsHu Я не знаю, как использовать GPUImageView, но с GPUImage он тоже работает нормально и легко ..   -  person kalyan pvs    schedule 26.03.2014
comment
@kalyanpvs Пожалуйста, не могли бы вы показать мне, как вы его использовали?   -  person GrIsHu    schedule 26.03.2014
comment
@GrIsHu хорошо..подожди, я напишу..   -  person kalyan pvs    schedule 26.03.2014
comment
Спасибо всем, я решил свою проблему с помощью @user370305. Спасибо за ваше время и предложения.   -  person GrIsHu    schedule 26.03.2014
comment
Добро пожаловать. Рад помочь :)   -  person user370305    schedule 26.03.2014


Ответы (2)


Вы можете создать объект для GPUImage и применить фильтр.

    final GPUImage mGpuImage = new GPUImage(getApplicationContext());
    mGpuImage.setFilter(new GPUImageSharpenFilter());//Your filter here
    Bitmap effectsBItamap=mGpuImage.getBitmapWithFilterApplied(your bitmap);
person kalyan pvs    schedule 26.03.2014

Я решил свою проблему, используя метод saveToPictures() из GPUImageView.java. Я просто преобразовал File newImg в Uri и передал его слушателю метода onPictureSaved класса OnPictureSavedListener, как показано ниже:

        mGPUImageView.setDrawingCacheEnabled(true);
        File fil = new File(path);
        fil.mkdir();
        Random rand = new Random();
        int aa = rand.nextInt();

        mGPUImageView.setDrawingCacheEnabled(false);
         mGPUImageView.saveToPictures("MyPics", "Photo"+aa+".jpg", picSaveListener);
        picSaveListener.onPictureSaved(Uri.fromFile(newImg)); 

   OnPictureSavedListener picSaveListener = new OnPictureSavedListener() {

    @Override
    public void onPictureSaved(Uri uri) {

    }
};
person GrIsHu    schedule 26.03.2014
comment
Привет, я хочу получить растровое изображение родительского представления, а родительское представление содержит mGPUImageView. Но когда я получаю растровое изображение из родительского представления, оно показывает только черный экран. Как я могу это сделать? заранее спасибо - person Ganesh Katikar; 28.03.2015