我使用png文件为需要alpha的对象启动了我的Android应用程序,但我很快意识到所需的空间太多了。所以,我写了一个程序,用一个带有alpha的png并创建了一个b& w alpha mask png文件和一个jpeg。这给了我巨大的空间节省,但速度不是很快。
以下是我的Android应用中的代码,它结合了jpg图像(代码中的origImgId)和png掩码(代码中的alphaImgId)。
它有效,但速度不快。我已经缓存了结果,我正在处理代码,这些代码将在游戏开始之前在菜单屏幕中加载这些图像,但如果有办法加快速度,那就太好了。
有没有人有任何建议?请注意,我稍微修改了代码,以使其易于理解。在游戏中,这实际上是一个精灵,它按需加载图像并缓存结果。在这里,您只需看到加载图像和应用alpha的代码。
public class BitmapDrawableAlpha
{
public BitmapDrawableAlpha(int origImgId, int alphaImgId) {
this.origImgId = origImgId;
this.alphaImgId = alphaImgId;
}
protected BitmapDrawable loadDrawable(Activity a) {
Drawable d = a.getResources().getDrawable(origImgId);
Drawable da = a.getResources().getDrawable(alphaImgId);
Bitmap b = Bitmap.createBitmap(d.getIntrinsicWidth(),d.getIntrinsicHeight(),Bitmap.Config.ARGB_8888);
{
Canvas c = new Canvas(b);
d.setBounds(0,0,d.getIntrinsicWidth()-1,d.getIntrinsicHeight()-1);
d.draw(c);
}
Bitmap ba = Bitmap.createBitmap(d.getIntrinsicWidth(),d.getIntrinsicHeight(),Bitmap.Config.ARGB_8888);
{
Canvas c = new Canvas(ba);
da.setBounds(0,0,d.getIntrinsicWidth()-1,d.getIntrinsicHeight()-1);
da.draw(c);
}
applyAlpha(b,ba);
return new BitmapDrawable(b);
}
/** Apply alpha to the specified bitmap b. */
public static void applyAlpha(Bitmap b, Bitmap bAlpha) {
int w = b.getWidth();
int h = b.getHeight();
for(int y=0; y < h; ++y) {
for(int x=0; x < w; ++x) {
int pixel = b.getPixel(x,y);
int finalPixel = Color.argb(Color.alpha(bAlpha.getPixel(x,y)), Color.red(pixel), Color.green(pixel), Color.blue(pixel));
b.setPixel(x,y,finalPixel);
}
}
}
private int origImgId;
private int alphaImgId;
}
答案 0 :(得分:2)
如果您要操作每个多个像素,可以调用getPixels()和setPixels()来同时获取所有像素。这将阻止循环中的其他方法调用和内存引用。
您可以做的另一件事是使用按位或者辅助方法添加像素。防止方法调用应该提高效率:
public static void applyAlpha(Bitmap b, Bitmap bAlpha) {
int w = b.getWidth();
int h = b.getHeight();
int[] colorPixels = new int[w*h];
int[] alphaPixels = new int[w*h];
b.getPixels(colorPixels, 0, w, 0, 0, w, h);
bAlpha.getPixels(alphaPixels, 0, w, 0, 0, w, h);
for(int j = 0; j < colorPixels.length;j++){
colorPixels[j] = alphaPixels[j] | (0x00FFFFFF & colorPixels[j]);
}
b.setPixels(colorPixels, 0, w, 0, 0, w, h);
}
据说你正在尝试进行的过程相当简单,我无法想象这些将提供巨大的性能提升。从这一点来说,我可以提供的唯一建议是使用NDK转到本机实现。
编辑:此外,由于使用getPixels()
或getPixel()
的位图不一定是可变的,因此您可以使用BitmapFactory.decodeResource()获取alpha位图:< / p>
Bitmap ba = BitmapFactory.decodeResource(a.getResources(), alphaImgId);