例如:
我的位图大小为500x500。在这个位图上,我有2个区域的坐标。 一个区域位于X = 10,Y = 10,大小为10x10 第二区域在X = 400,Y = 400,尺寸10×10
在位图中交换这两个区域的最佳方法是什么。
答案 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)
最好的方法与切换任何类型的数据相同:
这是我编写的示例代码。它没有经过测试,但应该有效:
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());
我希望我在这里没有犯错,因为我没有测试过。