0

前任。:

我的位图大小为 500x500。在这个位图上,我有 2 个区域的坐标。一个区域位于 X=10, Y=10, 尺寸 10x10 第二个区域位于 X=400, Y=400, 尺寸 10x10

在位图中交换这两个区域的最佳方法是什么。

4

3 回答 3

1

你可以通过 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)

于 2013-08-26T20:33:32.570 回答
0

最好的方法与切换任何类型的数据相同:

  • 制作一个临时位图来保存 area1 数据并将数据放在那里。
  • 将 area2 数据放入 area1。
  • 将临时位图数据放入 area2 ,并回收临时位图。

这是我编写的示例代码。它未经测试,但应该可以工作:

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());

我希望我没有在这里犯任何错误,因为我还没有测试过。

于 2013-08-26T20:54:18.223 回答
0

嗯,一个简单的“残忍”的方法可以完成这项工作:

将位图加载到二维数组中并交换单元格。

大约需要:500x500x4 字节,略小于 1 兆字节的内存,这对于如今的 android 手机来说不算什么,因为应用程序在使用时至少有 8/16 mgb 的内存。(在较弱的手机上)

即使您对位图进行大量处理,例如调整大小等,操作也会非常快......

如果您不能获得最佳性能,您可以使用本机代码,有一些用于处理位图的库,它们的内存和 CPU 效率都很高。

于 2013-08-26T20:25:12.553 回答