2011-11-13 15 views
10

たとえば、ビットマップの4面すべてに10pixelの白い境界線が必要です。私は画像ビューのためにそれを使用していません 私は現在この画像をトリミングするためにこのコードを使用しています。どのように白い枠線を追加することができるのか分かりますか?ビットマップの周りに白い枠線を作成するには?

public Bitmap scaleCenterCrop(Bitmap source, int newHeight, int newWidth) { 
    int sourceWidth = source.getWidth(); 
    int sourceHeight = source.getHeight(); 

    // Compute the scaling factors to fit the new height and width, respectively. 
    // To cover the final image, the final scaling will be the bigger 
    // of these two. 
    float xScale = (float) newWidth/sourceWidth; 
    float yScale = (float) newHeight/sourceHeight; 
    float scale = Math.max(xScale, yScale); 

    // Now get the size of the source bitmap when scaled 
    float scaledWidth = scale * sourceWidth; 
    float scaledHeight = scale * sourceHeight; 

    // Let's find out the upper left coordinates if the scaled bitmap 
    // should be centered in the new size give by the parameters 
    float left = (newWidth - scaledWidth)/2; 
    float top = (newHeight - scaledHeight)/2; 

    // The target rectangle for the new, scaled version of the source bitmap will now 
    // be 
    RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight); 

    // Finally, we create a new bitmap of the specified size and draw our new, 
    // scaled bitmap onto it. 
    Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig()); 
    Canvas canvas = new Canvas(dest); 
    canvas.drawBitmap(source, null, targetRect, null); 

    return dest; 
} 

答えて

13

白い背景を描きます。あなたのビットマップをそれに追加するよりも大きくして、キャンバスに必要な背景を塗りつぶします。他のエフェクトを追加する必要がある場合は、四角形をクリッピングし、角を丸くするキャンバスオプションを調べることができます。

RectF targetRect = new RectF(left+10, top+10, left + scaledWidth, top + scaledHeight); 
Bitmap dest = Bitmap.createBitmap(newWidth+20, newHeight+20, source.getConfig()); 
Canvas canvas = new Canvas(dest); 
canvas.drawColor(Color.WHITE); 
canvas.drawBitmap(source, null, targetRect, null); 
+0

が機能しません。画像の白い枠線が4面に表示されません。トップとボトムのボーダーのみ – ericlee

+2

あなたは、あなたが望む効果を得るために、基本的な考え方をtargetRectとビットマップサイズで使い分けています。 – caguilar187

0

ImageViewの背景を白に設定し、パディング値を追加するのが簡単な方法です。

wrap_contentのw/hのFrameLayoutを作成し、その背景を白に設定し、そこにImageViewを配置し、ImageViewの余白を目的の境界幅に設定します。

+1

を境界線を追加します、これを試してみてください... – ericlee

0

エレガントではないが、あなたは常にちょうどその背後に四角形を描画することができ、あなたはすでにこれを行うには、コードを持っており、任意のパフォーマンスへの影響は目立たない

+0

やあ、あなたはそれが行われているか私を見ることができますか?私は白いrecntage bgを描画する方法を試そうとしています – ericlee

+0

正方形のビットマップの周りに境界線が欲しいですか?もしそうなら別の正方形のビットマップを描き直して – Chris

+0

私にどのように表示できますか? – ericlee

0

あることを行っているあなたは、あなたのtargetRectangle 20ピクセル広く

20ピクセル以上を作成することができます
RectF targetRect = new RectF(left, top, left + scaledWidth + 20, top + scaledHeight + 20); 

と、これを行う方法については

+0

マップアイテムオーバーレイに使用すると、ビットマップ – ericlee

1

ビットマップの描画後に4つの四角形を描画できます。

point 0,0,3,sizey 
point 0,0,sizex,3 
point 0,sizey-3,sizex,sizey 
point sizex-3,0,sizex,sizey 
50

私はこの機能を書いた:

private Bitmap addWhiteBorder(Bitmap bmp, int borderSize) { 
    Bitmap bmpWithBorder = Bitmap.createBitmap(bmp.getWidth() + borderSize * 2, bmp.getHeight() + borderSize * 2, bmp.getConfig()); 
    Canvas canvas = new Canvas(bmpWithBorder); 
    canvas.drawColor(Color.WHITE); 
    canvas.drawBitmap(bmp, borderSize, borderSize, null); 
    return bmpWithBorder; 
} 

基本的には各次元に2 * bordersizeを追加する新しいビットマップを作成し、bordersizeでそれを相殺し、その上に元のビットマップを描画します。

+2

これは、イメージビューのサイズが表示されているイメージのサイズよりも大きく、一部の部分が他の部分よりも多く塗りつぶされているため、背景とパディングの境界線の通常の方法が失敗した場合に機能します。この方法は完璧です。名声。 –

0

、それはまた、ImageViewのために使用していない、ビットマップキャンバスに

canvas.drawLine(0, 0, canvas.getWidth(), 0, paint2); 
     canvas.drawLine(0, 0, 0, canvas.getHeight(), paint2); 
     canvas.drawLine(0, canvas.getHeight(), canvas.getWidth(), 
       canvas.getHeight(), paint2); 
     canvas.drawLine(canvas.getWidth(), 0, canvas.getWidth(), 
       canvas.getHeight(), paint2); 
関連する問題