我有一个位图,它的像素只包含两个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);
}
}
}这在便宜的手机上是非常慢的,即使是一个小的位图,有谁知道如何A)做得更快,或者B)放大位图而不出现新的argb值?
发布于 2011-08-09 00:51:45
我认为这里的答案是一个算法。
位图操作非常昂贵...也许您可以将位图缓存在某个地方,并仅在明确请求插值时才绘制它?
我的另一个想法是将一些像素分组在一起,并有一个标志"hasChanged“或类似的标志,当某些东西发生变化时将其设置为true,这样系统就知道它必须重新绘制像素组。这样你就不会在必要的时候更频繁地重画东西。
希望这能有所帮助!
发布于 2011-08-09 02:31:30
在代码中进行缩放,因为内置算法不是您想要的。你将避免你不想要的插值,并且你不需要撤销它。(请原谅任何编码错误--这是我在没有访问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 = 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);https://stackoverflow.com/questions/6985428
复制相似问题