2016-09-09 3 views
1

Я использую фрески для отображения изображений в своем приложении. Прямо сейчас я пытаюсь применить некоторые фильтры к моим изображениям, но проблема в том, что в библиотеке фильтра результат Bitmap. Но draweeView.setImageBitmap устарел.Android fresco lib, применить собственный фильтр

Я также попытался с постпроцессора, как этот

MeshPostprocessor meshPostprocessor = new MeshPostprocessor(); 
    meshPostprocessor.setFilter(filters.get(0)); 

    draweeView = (SimpleDraweeView) view.findViewById(R.id.filter_image); 

    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(image) 
      .setPostprocessor(meshPostprocessor) 
      .setResizeOptions(new ResizeOptions(100, 100)) 
      .build(); 

    PipelineDraweeController controller = (PipelineDraweeController) 
      Fresco.newDraweeControllerBuilder() 
        .setImageRequest(request) 
        .setOldController(draweeView.getController()) 
        .build(); 
    draweeView.setController(controller); 

и здесь постпроцессор

public static class MeshPostprocessor extends BaseRepeatedPostProcessor { 
    private AbstractConfig.ImageFilterInterface filter; 

    public void setFilter(AbstractConfig.ImageFilterInterface filter) { 
     this.filter = filter; 
     update(); 
    } 

    @Override 
    public String getName() { 
     return "meshPostprocessor"; 
    } 

    @Override 
    public void process(Bitmap bitmap) { 
     bitmap = filter.renderImage(bitmap); 
    } 
} 

так, когда я нажимаю на фильтре я просто запустить этот

meshPostprocessor.setFilter(colorFilterConfig.get(position)); 

Я попытался с отладчиком, код проходит через все методы (setFilter, процесс и т. Д.), Но изображение не является ch ...

Что мне не хватает?

ответ

2

Я думаю, что вам не нужен BaseRepeatedPostProcessor в вашем случае. Нормального BasePostProcessor должно быть достаточно здесь.

Однако этот вопрос, кажется, ваш пользовательский фильтр:

@Override 
public void process(Bitmap bitmap) { 
    bitmap = filter.renderImage(bitmap); 
} 

Я предполагаю, что это возвращает другой Bitmap? Это не работает в Java/for Fresco.

Если ваш фильтр может выполнять обработку на месте, вы можете использовать process(Bitmap bitmap) и напрямую модифицировать данную растровую карту (например, bitmap.setPixel(...)).

Если вы не можете сделать это на месте, вы можете изменить process(Bitmap destBitmap, Bitmap sourceBitmap) и изменить destBitmap.

Если ваше растровое изображение изменяет его размер, вы можете переопределить CloseableReference<Bitmap> process(Bitmap sourceBitmap, PlatformBitmapFactory bitmapFactory). Однако в этом случае обязательно используйте предоставленные bitmapFactory, чтобы создать новый растровый файл, чтобы быть эффективным.

Для получения дополнительной информации, просмотрите http://frescolib.org/docs/modifying-image.html для получения дополнительной информации или ознакомьтесь с JavaDoc for BasePostprocessor.

+0

Мне нужен повторный процессор, потому что я должен иметь возможность менять фильтры много раз. Ваше сообщение было действительно полезным. Все, что мне нужно было сделать, это просто добавить супер в конец –

0

нормально так, как я решить это путем добавления супер вызова на процесс, как этот

@Override 
public void process(Bitmap dest, Bitmap source) { 
     Bitmap filtered = filter.renderImage(source, intensity); 
     super.process(dest, filtered); 
} 

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

+0

Ну, это работает, потому что, если вы посмотрите на исходный код, супер делает «Bitmaps.copyBitmap (destBitmap, sourceBitmap);». Как правило, вы не должны называть супер, когда вы переопределяете. Вы можете вызвать «Bitmaps.copyBitmap» (destBitmap, sourceBitmap); вместо этого. Однако отсутствие временного фильтра Bitmap было бы идеальным, так как теперь у вас есть 3 вместо 2 растровых изображений в памяти, и ваш фильтрованный, скорее всего, также будет работать на куче Java, и для этого требуется очистка GC, что не идеально. –

Смежные вопросы