0

私は、画像をダウンロードし、ピカソを使用してCardViewに表示するサービスを提供しています。画像から空白を削除する

Picasso.with(context).load(beer.getLabelLarge()).fit().centerCrop().into(imgBeerLabel); 

しかし、これらの画像は、望ましくない空白に関与しています:

enter image description here

enter image description here

私はこれらの画像をトリミングしたいと白のボーダーなしで、ラベルのみを示し、それをImageViewディメンションにサイズ変更します。

- 編集

白い部分は可変サイズです。

https://stackoverflow.com/questions/12175991/crop-image-white-space-automatically-using-jquery 

しかし、そこには私はこの時点で避けたいコードの多く、で解決しました:

問題は、この問題の報告と同じです。

イメージ内の特定の四角形に焦点を当て、その部分を拡大して、白い部分のサイズに関係なく画面全体に塗りつぶすことができます。

結果予想は以下のとおりです。ピカソや変換を使ってこれを行う方法は

enter image description here

ありますか?ベクター画像の

+0

あなたはラベルの幅と高さを知っていますか?必要なサイズにクロップするために変換を使用することができます – Raghunandan

+0

多分、あなたは答えのような何かを試すことができますhttps://stackoverflow.com/questions/12175991/crop-image-white-space-automatically-using-jquery –

+0

@Raghunandanいいえ。それは可変である。 – alexpfx

答えて

1

ninePatchイメージについてコードはthis libraryにあります。

これは、縦と横の両方の最初の異なるピクセルを探し、そこでビットマップをトリミングします。完璧ではありませんが、私のニーズに合っています。

public class CropMiddleFirstPixelTransformation implements Transformation { 
    private int mWidth; 
    private int mHeight; 


    @Override 
    public Bitmap transform(Bitmap source) { 
     int width = source.getWidth(); 
     int height = source.getHeight(); 

     int[] horizontalMiddleArray = new int[width]; 
     source.getPixels(horizontalMiddleArray, 0, width, 0, height/2, width, 1); 

     int[] verticalMiddleArray = new int[height]; 
     source.getPixels(verticalMiddleArray, 0, 1, width/2, 0, 1, height); 

     int left = getFirstNonWhitePosition(horizontalMiddleArray); 
     int right = getLastNonWhitePosition(horizontalMiddleArray); 

     int top = getFirstNonWhitePosition(verticalMiddleArray); 
     int bottom = getLastNonWhitePosition(verticalMiddleArray); 

     mWidth = right - left; 
     mHeight = bottom - top; 


     if (!isNegative(left, right, top, bottom)) { 
      return source; 
     } 

     Bitmap bitmap = Bitmap.createBitmap(source, left, top, mWidth , mHeight); 
     source.recycle(); 
     return bitmap; 

    } 

    private boolean isNegative(int... values) { 
     for (int i : values) { 
      if (i < 0) { 
       return false; 
      } 
     } 
     return true; 

    } 

    private int getFirstNonWhitePosition(int[] horizontalMiddleArray) { 
     int left = 0; 
     for (int i = 0; i < horizontalMiddleArray.length; i++) { 
      if (i == 0) { 
       left = horizontalMiddleArray[i]; 
      } 
      if (left != horizontalMiddleArray[i]) { 
       return i; 
      } 
     } 
     return -1; 
    } 

    private int getLastNonWhitePosition(int[] horizontalMiddleArray) { 
     int right = 0; 
     int length = horizontalMiddleArray.length; 
     for (int i = length - 1; i > 0; i--) { 
      if (i == length - 1) { 
       right = horizontalMiddleArray[i]; 
      } 
      if (right != horizontalMiddleArray[i]) { 
       return i; 
      } 
     } 
     return -1; 
    } 


    @Override 
    public String key() { 
     return "CropMiddleFirstPixelTransformation(width=" + mWidth + ", height=" + mHeight + ")"; 
    } 
}