2016-09-09 2 views
1

Ich verwende Fresko, um Bilder zu meiner App anzuzeigen. Im Moment versuche ich, einige Filter auf meine Bilder anzuwenden, aber das Problem ist, dass die Filterbibliothek nur Bitmap ergibt. Aber die draweeView.setImageBitmap ist veraltet.Android Fresko lib, benutzerdefinierte Filter anwenden

Ich habe auch versucht, mit einem Postprozessor wie diese

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); 

und hier ist der Postprozessor

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); 
    } 
} 

so, wenn ich auf einem Filter klicken ich diese nur laufen

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

Ich habe es mit dem Debugger versucht, der Code durchläuft alle Methoden (setFilter, process etc ..) aber das Bild ist nicht ch überhaupt altern ...

Was fehlt mir?

Antwort

2

Ich denke, Sie brauchen keine BaseRepeatedPostProcessor in Ihrem Fall. Ein normaler BasePostProcessor sollte hier ausreichen.

Allerdings scheint das Problem Ihrer benutzerdefinierten Filter zu sein:

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

Ich nehme an, es eine andere Bitmap zurückgibt? Dies funktioniert nicht in Java/für Fresco.

Wenn Ihr Filter die Verarbeitung an Ort und Stelle durchführen kann, können Sie process(Bitmap bitmap) verwenden und die angegebene Bitmap direkt ändern (z. B. bitmap.setPixel(...)).

Wenn Sie es nicht an Ort und Stelle machen können, können Sie stattdessen process(Bitmap destBitmap, Bitmap sourceBitmap) überschreiben und destBitmap ändern.

Wenn Ihre Bitmap ihre Größe ändert, können Sie CloseableReference<Bitmap> process(Bitmap sourceBitmap, PlatformBitmapFactory bitmapFactory) überschreiben. Stellen Sie in diesem Fall jedoch sicher, dass Sie das bereitgestellte bitmapFactory verwenden, um das neue Bitmap zu erstellen, damit es effizient ist.

Weitere Informationen finden Sie unter http://frescolib.org/docs/modifying-image.html für weitere Informationen oder überprüfen Sie die JavaDoc for BasePostprocessor.

+0

Ich brauchte den repeatedProcessor, weil ich in der Lage sein sollte, die Filter viele Male zu ändern. Dein Beitrag war wirklich hilfreich. Alles, was ich tun musste, ist einfach die Super am Ende hinzufügen –

0

ok so, wie ich gelöst dies ist wie dies

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

einen Super Anruf auf dem Prozess Zugabe bemerkte ich nicht, dass man super, um verlangen, damit die Änderungen wirksam werden.

+0

Nun, das funktioniert, weil, wenn Sie einen Blick auf den Quellcode, Super 'Bitmaps.copyBitmap (destBitmap, sourceBitmap);'. Normalerweise sollten Sie Super nicht beim Überschreiben aufrufen. Sie können stattdessen Bitmaps.copyBitmap (destBitmap, sourceBitmap); 'aufrufen. Es wäre jedoch ideal, wenn das temporäre Bitmap nicht gefiltert würde, da Sie jetzt 3 statt 2 Bitmaps im Speicher haben und Ihr gefiltertes wird wahrscheinlich auch auf dem Java-Heap leben und einen Bereinigungs-GC benötigen, was nicht ideal ist. –