Android:有效地确保缩放位图中的像素只有两种颜色

Android:有效地确保缩放位图中的像素只有两种颜色,android,image,scale,Android,Image,Scale,我有一个位图,它的像素只包含两个argb值:纯黑色和纯透明。然后我在Android中放大位图,现在位图有很多argb值:纯黑色和纯透明,以及具有不同透明度级别的黑色(即半透明黑色);这是由于android自动完成的插值。我希望位图像素只包含原始的两个argb值 目前,我通过以下过程完成此任务: my_bitmap = Bitmap.createScaledBitmap(BitmapFactory .decodeResource(context.getR

我有一个位图,它的像素只包含两个argb值:纯黑色和纯透明。然后我在Android中放大位图,现在位图有很多argb值:纯黑色和纯透明,以及具有不同透明度级别的黑色(即半透明黑色);这是由于android自动完成的插值。我希望位图像素只包含原始的两个argb值

目前,我通过以下过程完成此任务:

  my_bitmap = Bitmap.createScaledBitmap(BitmapFactory
                    .decodeResource(context.getResources(),
                            R.drawable.my_resource), 
                                  new_width, new height, false);

for (int i = 0; i < my_bitmap.getWidth(); i++) {
                for (int j = 0; j < my_bitmap.getWidth(); j++) {
                    if (my_bitmap.getPixel(i, j) != Color.TRANSPARENT) {
                        my_bitmap.setPixel(i, j, Color.BLACK);
                    }
                }
        }
my_bitmap=bitmap.createScaledBitmap(BitmapFactory
.decodeResource(context.getResources(),
R.可提取。我的资源),
新宽度、新高度、错误);
对于(int i=0;i

在便宜的手机上,即使是一个很小的位图,速度也会非常慢。有人知道如何a)更快地执行此操作,或者B)在没有新的argb值出现的情况下放大位图吗?

我认为这里的答案是算法

位图操作非常昂贵。。。也许您可以将位图缓存在某个位置,并且仅在明确请求插值时绘制它

我的另一个想法是将一定数量的像素组合在一起,并有一个标志“hasChanged”或类似的标志,当某些内容发生更改时,将其设置为true,以便系统知道必须重新绘制该像素组。通过这种方式,您不需要频繁地重新绘制内容


希望这有帮助

在代码中进行缩放,因为内置算法不是您想要的。您将避免不需要的插值,并且不必撤消它。(请原谅任何编码错误——我写这篇文章时没有访问IDE或编译器。)

my_bitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.my_resource);
int[]src=new int[my_bitmap.getWidth()*my_bitmap.getHeight()];
my_bitmap.getPixels(src,0,my_bitmap.getWidth(),0,0,my_bitmap.getWidth(),my_bitmap.getHeight());
int[]dst=新int[新宽度*新高度];
float scaleX=my\u bitmap.getWidth()/new\u width;
float scaleY=my\u bitmap.getHeight()/new\u height;
对于(int y=0;y
谢谢,在某种程度上你是对的,但我还是不明白为什么这么慢。位图不只是一种多维数组吗?我可以在不调用getPixel和setPixel的情况下对其进行迭代?也许这会加快速度。是的,但速度非常慢,因为每次位图的哈希代码更改时,屏幕都需要重新绘制位图。绘图是昂贵的,而不是内存中的操作。这就是为什么我建议缓存位图,以便每次操作只重新绘制一次。我不明白,在执行此操作时,屏幕上没有此位图,我认为这就足够了。我还需要采取哪些步骤来缓存它?
my_bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_resource);
int[] src = new int[my_bitmap.getWidth() * my_bitmap.getHeight()];
my_bitmap.getPixels(src, 0, my_bitmap.getWidth(), 0, 0, my_bitmap.getWidth(), my_bitmap.getHeight());
int[] dst = new int[new_width * new_height];
float scaleX = my_bitmap.getWidth() / new_width;
float scaleY = my_bitmap.getHeight() / new_height;
for (int y = 0; y < new_height; y++) {
    for (int x = 0; x < new_width; x++) {
        int srcY = (int) (y * scaleY);
        int srcX = (int) (x * scaleX);
        dst[y*new_height + x] = src[srcY*my_bitmap.getHeight() + srcX];
    }
}
Bitmap newBitmap = Bitmap.createBitmap(dst, 0, new_width, new_width, new_height, Bitmap.Config.ARGB_8888);