在android中将位图转换为棕褐色
Posted
技术标签:
【中文标题】在android中将位图转换为棕褐色【英文标题】:Convert bitmap to sepia in android 【发布时间】:2011-05-07 16:04:33 【问题描述】:有没有办法将位图转换为棕褐色? 我知道转换为 grayScale 是在 ColorMatrix 中设置 setSaturation。 但是棕褐色呢?
【问题讨论】:
@EpicPandaForce:您的具体要求是什么?您想要一种具有不同方法的算法吗? @aminography 我想为这里现有的答案之一提供 250 个声誉,因为它解决了我今天遇到的问题;但我还有 16 小时的时间可以颁发该奖项。 哦,干得好老兄:-) 【参考方案1】:如果您有图像实例,那么您可以使用 ColorMartix 在 Sepia 中绘制它。让我描述一下如何使用 Drawable 来做到这一点。
public static void setSepiaColorFilter(Drawable drawable)
if (drawable == null)
return;
final ColorMatrix matrixA = new ColorMatrix();
// making image B&W
matrixA.setSaturation(0);
final ColorMatrix matrixB = new ColorMatrix();
// applying scales for RGB color values
matrixB.setScale(1f, .95f, .82f, 1.0f);
matrixA.setConcat(matrixB, matrixA);
final ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrixA);
drawable.setColorFilter(filter);
示例项目已从 Bitbucket 移至 GitHub。请查看Release section下载APK二进制文件进行测试,无需编译。
【讨论】:
如何获得 ColorMatric 以获得更多效果,如霓虹灯、靛蓝、浅绿色、生动等,等待相关链接/提示/指南... 你需要找到对应的颜色矩阵值来获得这些效果。抱歉,我不知道您可以在哪里找到它。如果您发现任何有用的信息,请在此处发布。谢谢 我为 ColorMatrix 找到了这个,并为我需要的颜色效果设置了类似的值。 docs.rainmeter.net/tips/colormatrix-guide 其实很简单,只要根据颜色的 RGB 值找到值,就可以得到任何你想要的颜色。一旦饱和度设置为 0,它会将像素的亮度与新颜色结合起来,然后就可以正常工作了。虽然我正在回答 6 年前被问到的问题......:D【参考方案2】:我知道答案,但也许有人有其他更好的解决方案..
public Bitmap toSephia(Bitmap bmpOriginal)
int width, height, r,g, b, c, gry;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();
int depth = 20;
Bitmap bmpSephia = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmpSephia);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setScale(.3f, .3f, .3f, 1.0f);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
canvas.drawBitmap(bmpOriginal, 0, 0, paint);
for(int x=0; x < width; x++)
for(int y=0; y < height; y++)
c = bmpOriginal.getPixel(x, y);
r = Color.red(c);
g = Color.green(c);
b = Color.blue(c);
gry = (r + g + b) / 3;
r = g = b = gry;
r = r + (depth * 2);
g = g + depth;
if(r > 255)
r = 255;
if(g > 255)
g = 255;
bmpSephia.setPixel(x, y, Color.rgb(r, g, b));
return bmpSephia;
【讨论】:
当图像像素更多时,这将需要更多的处理时间,所以还有其他方法吗? 此方法在透明像素上失败【参考方案3】:我对@987654321@ 进行了改进。与the ColorMatrix
method 相比,它的运行速度具有竞争力,但会产生更好的棕色调。 (在我看来)
public Bitmap toSepiaNice(Bitmap color)
int red, green, blue, pixel, gry;
int height = color.getHeight();
int width = color.getWidth();
int depth = 20;
Bitmap sepia = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
int[] pixels = new int[width * height];
color.getPixels(pixels, 0, width, 0, 0, width, height);
for (int i = 0; i < pixels.length; i++)
pixel = pixels[i];
red = (pixel >> 16) & 0xFF;
green = (pixel >> 8) & 0xFF;
blue = pixel & 0xFF;
red = green = blue = (red + green + blue) / 3;
red += (depth * 2);
green += depth;
if (red > 255)
red = 255;
if (green > 255)
green = 255;
pixels[i] = (0xFF << 24) | (red << 16) | (green << 8) | blue;
sepia.setPixels(pixels, 0, width, 0, 0, width, height);
return sepia;
【讨论】:
以上是关于在android中将位图转换为棕褐色的主要内容,如果未能解决你的问题,请参考以下文章
如何在xamarin android中将位图图像转换为gif?
在 NetworkOnMainThreadException 中将 url 转换为位图 [重复]