如何在位图中交换区域

时间:2013-08-26 18:06:14

标签: android

例如:

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

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

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

它大概需要大约500x500x4字节,这比内存的1兆字节小一点,这对于Android手机来说现在没什么,因为app在使用时至少有8/16 mgb的内存。电话)

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

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

答案 2 :(得分: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());

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

相关问题