2016-09-09 8 views
1

私は自分のアプリに画像を表示するためにフレスコ画を使用しています。今私はいくつかのフィルタを自分のイメージに適用しようとしていますが、問題は、フィルタライブラリがビットマップになるということです。しかし、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); 

のようなポストプロセッサで試してみましたが、私は、フィルタをクリックしたときに、私はちょうどこの

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

を実行するポストプロセッサ

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

です私はデバッガを試したが、コードはすべてのメソッド(setFilter、プロセスなど..)を通過するが、イメージはchではない怒っている...

私は何が欠けていますか?

答えて

2

あなたの場合はBaseRepeatedPostProcessorは必要ありません。 ここでは通常のBasePostProcessorで十分です。私はそれが別のビットマップを返したと

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

しかし、問題は、カスタムフィルタのようですか?これはJava/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

私はフィルタを何度も変更できるはずですので、repeatedProcessorが必要でした。あなたの投稿は実際に役に立ちました。私は、最後にスーパーを追加するだけです。 –

0

OK、私はこれを解決方法は、この

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

のようなプロセスでスーパーコールを追加することですので、私はあなたの変更が効果を持つようにするためにスーパーを呼び出す必要があることに気づいていませんでした。

+0

ソースコードを見ると、スーパーは 'Bitmaps.copyBitmap(destBitmap、sourceBitmap);'を実行します。通常、オーバーライドするときにsuperを呼び出すべきではありません。代わりに 'Bitmaps.copyBitmap(destBitmap、sourceBitmap);'を呼び出すことができます。しかし、一時的なビットマップをフィルタリングしないことは理想的です。メモリに2つのビットマップの代わりに3つのビットマップがあり、フィルタされたビットマップはJavaヒープ上に存在する可能性が高く、GCをクリーニングする必要があります。 –

関連する問題