このサイトは初めてで、Androidについて質問があります。
ビットマップをグレースケールに変換する方法はありますか?私は、キャンバス操作を使用してグレースケールのビットマップを描画する方法を知っています: http://www.mail-archive.com/[email protected]/msg38890.html )灰色のビットマップ(または少なくともビットマップに後で変換できるもの)。手作業で実装する必要がありますか(ピクセルごとの操作)?
よく検索しましたが、まだ見つかりませんでした。誰でも簡単で効率的な方法を知っていますか?
どうもありがとう!
それはあなたがリンクしているコードが正確に何をしていないのですか?カラービットマップ( "bmp")を取得し、複製ビットマップ( "bm")を作成し、フィルターを使用してカラービットマップを "bm"に描画してグレースケールにします。その時点から、「bm」を実際のグレースケールビットマップとして使用し、それを使って何でもできます。
サンプルを少し微調整する必要があります(ハードコードされたサイズを使用しているため、元のビットマップのサイズを複製することもできます)が、それ以外は、これはすぐに使えるように見える、あなたが望むものに応じて。
ああ、そうです。私はそれを間違って使っていました、私に指摘してくれてありがとう。 (役に立たない質問は申し訳ありません)誰かを助けるかもしれないので、ここに終了コード(リンクされたものに大きく基づいています)があります:
public Bitmap toGrayscale(Bitmap bmpOriginal)
{
int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();
Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
Paint.setColorFilter(f);
c.drawBitmap(bmpOriginal, 0, 0, Paint);
return bmpGrayscale;
}
それに関する意見やコメントは大歓迎です。
ありがとう
ImageView
でそのビットマップを表示する場合。その後、ビットマップをグレースケールに変換する代わりに、以下のコードを試すことができます:
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
imageview.setColorFilter(filter);
このアプローチでは、1つの重要な側面を考慮に入れる必要があることに言及したいと思います。 BitMapのAndroidはNativeHeapに保存されます。「ビットマップを作成する」だけで、最終的にメモリを詰まらせ、OutOfMemoryException
(OOM)を取得します。
そのため、ビットマップは常に.recycled()
でなければなりません。
Androidのすべてのバージョンをサポートするために作成した、より効率的な方法を次に示します。
// https://xjaphx.wordpress.com/2011/06/21/image-processing-grayscale-image-on-the-fly/
@JvmStatic
fun getGrayscaledBitmapFallback(src: Bitmap, redVal: Float = 0.299f, greenVal: Float = 0.587f, blueVal: Float = 0.114f): Bitmap {
// create output bitmap
val bmOut = Bitmap.createBitmap(src.width, src.height, src.config)
// pixel information
var A: Int
var R: Int
var G: Int
var B: Int
var pixel: Int
// get image size
val width = src.width
val height = src.height
// scan through every single pixel
for (x in 0 until width) {
for (y in 0 until height) {
// get one pixel color
pixel = src.getPixel(x, y)
// retrieve color of all channels
A = Color.alpha(pixel)
R = Color.red(pixel)
G = Color.green(pixel)
B = Color.blue(pixel)
// take conversion up to one single value
B = (redVal * R + greenVal * G + blueVal * B).toInt()
G = B
R = G
// set new pixel color to output bitmap
bmOut.setPixel(x, y, Color.argb(A, R, G, B))
}
}
// return final image
return bmOut
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@JvmStatic
fun getGrayscaledBitmap(context: Context, src: Bitmap): Bitmap {
// https://Gist.github.com/imminent/cf4ab750104aa286fa08
// https://en.wikipedia.org/wiki/Grayscale
val redVal = 0.299f
val greenVal = 0.587f
val blueVal = 0.114f
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)
return getGrayscaledBitmapFallback(src, redVal, greenVal, blueVal)
val render = RenderScript.create(context)
val matrix = Matrix4f(floatArrayOf(-redVal, -redVal, -redVal, 1.0f, -greenVal, -greenVal, -greenVal, 1.0f, -blueVal, -blueVal, -blueVal, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f))
val result = src.copy(src.config, true)
val input = Allocation.createFromBitmap(render, src, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT)
val output = Allocation.createTyped(render, input.type)
// Inverts and do grayscale to the image
@Suppress("DEPRECATION")
val inverter =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat)
ScriptIntrinsicColorMatrix.create(render)
else
ScriptIntrinsicColorMatrix.create(render, Element.U8_4(render))
inverter.setColorMatrix(matrix)
inverter.forEach(input, output)
output.copyTo(result)
src.recycle()
render.destroy()
return result
}