我正在尝试更改for循环中每个像素的位图的alpha值。 Bitmap是从另一个位图的createBitmap(source,x,y,w,h)创建的。我做了一点测试,但我似乎无法改变alpha。它是setPixel命令还是位图它不是ARGB的事实?
我想在最后创建一个简单的淡出效果但是现在我没有引用原始像素颜色只是半绿色的绿色。如果您能提供帮助,谢谢!)
_left[1] = Bitmap.createBitmap(TestActivity.photo, 0, 0, 256, 256);
for (int i = 0; i < _left[1].getWidth(); i++)
for (int t = 0; t < _left[1].getHeight(); t++) {
int a = (_left[1].getWidth() / 2) - i;
int b = (_left[1].getHeight() / 2) - t;
double dist = Math.sqrt((a*a) + (b*b));
if (dist > 20) _left[1].setPixel(i, t, Color.argb(128, 0, 255, 0));
}
更新:
好的,这是我想出的结果,如果有人想要一个位图并径向淡出。但是,如果没有阵列,它是非常缓慢的......感谢Reuben朝着正确的方向迈出了一步
public void fadeBitmap (Bitmap input, double fadeStartPercent, double fadeEndPercent, Bitmap output) {
Bitmap tempalpha = Bitmap.createBitmap(input.getWidth(), input.getHeight(), Bitmap.Config.ARGB_8888 );
Canvas printcanvas = new Canvas(output);
int radius = input.getWidth() / 2;
double fadelength = (radius * (fadeEndPercent / 100));
double fadestart = (radius * (fadeStartPercent / 100));
for (int i = 0; i < input.getWidth(); i++)
for (int t = 0; t < input.getHeight(); t++) {
int a = (input.getWidth() / 2) - i;
int b = (input.getHeight() / 2) - t;
double dist = Math.sqrt((a*a) + (b*b));
if (dist <= fadestart) {
tempalpha.setPixel(i,t,Color.argb(255, 255, 255, 255));
} else {
int fadeoff = 255 - (int) ((dist - fadestart) * (255/(fadelength - fadestart)));
if (dist > radius * (fadeEndPercent / 100)) fadeoff = 0;
tempalpha.setPixel(i,t,Color.argb(fadeoff, 255, 255, 255));
}
}
Paint alphaP = new Paint();
alphaP.setAntiAlias(true);
alphaP.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
// printcanvas.setBitmap();
printcanvas.drawBitmap(input, 0, 0, null);
printcanvas.drawBitmap(tempalpha, 0, 0, alphaP);
}
答案 0 :(得分:1)
您使用的Bitmap.createBitmap()
版本会返回不可变位图。 Bitmap.setPixel()
将无效。
setPixel非常慢。目标是使用setPixels(),或者最重要的是,找到比直接操作位图像素更好的方法。我希望你能用一个单独的alpha-only位图和right PorterDuff mode来做一些聪明的事。