前任。:
我的位图大小为 500x500。在这个位图上,我有 2 个区域的坐标。一个区域位于 X=10, Y=10, 尺寸 10x10 第二个区域位于 X=400, Y=400, 尺寸 10x10
在位图中交换这两个区域的最佳方法是什么。
前任。:
我的位图大小为 500x500。在这个位图上,我有 2 个区域的坐标。一个区域位于 X=10, Y=10, 尺寸 10x10 第二个区域位于 X=400, Y=400, 尺寸 10x10
在位图中交换这两个区域的最佳方法是什么。
你可以通过 Canvas 做到这一点。
就像是:
Bitmap swapped = Bitmap.createBitmap(origin.getWidth(), origin.getHeight(), origin.getConfig());
Canvas drawer = new Canvas(swapped);
drawer.drawBitmap(origin, new Rect(0,0,100,100), new Rect(100,100,100,100), paint);
drawer.drawBitmap(origin, new Rect(100,100,100,100), new Rect(0,0,100,100), paint);
那时,您的“交换”位图将在不同区域绘制原件。
有关更多信息,请参阅 Canvas 文档:
http://developer.android.com/reference/android/graphics/Canvas.html#drawBitmap(android.graphics.Bitmap , android.graphics.Matrix, android.graphics.Paint)
最好的方法与切换任何类型的数据相同:
这是我编写的示例代码。它未经测试,但应该可以工作:
Bitmap origin=...;
Rect r1=...,r2=... ; //assumption: both rectangles are of the same size
//copy from region1 to temp bitmap
Bitmap temp= Bitmap.createBitmap(origin,r1.left,r1.top,r1.width(),r1.height());
//copy from region2 into region1
Canvas canvas=new Canvas(origin);
canvas.drawBitmap(origin, r2, r1, new Paint());
//copy from temp bitmap to region2
canvas.drawBitmap(temp, new Rect(0,0,r2.width(),r2.height()), r2, paint);
temp.recycle();
另一种方法(在速度和/或内存方面可能更好)是使用 int 数组而不是新的位图对象,但我认为这种方法很容易理解。
这是替代方案:
Bitmap origin=...;
Rect r1=...,r2=... ; //assumption: both rectangles are of the same size
//copy from region1 to temp pixels
int[] pixels=new int[r1.width()*r1.height()];
origin.getPixels ( pixels, 0, origin.getWidth(), r1.left, r1.top, r1.width(), r1.height());
//copy from region2 into region1
Canvas canvas=new Canvas(origin);
canvas.drawBitmap(origin, r2, r1, new Paint());
//copy from temp pixels to region2
origin.setPixels (pixels, 0, origin.getWidth(), r2.left, r2.top, r2.width(), r2.height());
我希望我没有在这里犯任何错误,因为我还没有测试过。
嗯,一个简单的“残忍”的方法可以完成这项工作:
将位图加载到二维数组中并交换单元格。
大约需要:500x500x4 字节,略小于 1 兆字节的内存,这对于如今的 android 手机来说不算什么,因为应用程序在使用时至少有 8/16 mgb 的内存。(在较弱的手机上)
即使您对位图进行大量处理,例如调整大小等,操作也会非常快......
如果您不能获得最佳性能,您可以使用本机代码,有一些用于处理位图的库,它们的内存和 CPU 效率都很高。