我试图弄清楚如何使用我的热传感器将颜色更改为我在Android相机上的叠加层。问题是我得到的数据是16x4阵列。如何将此16x4网格调整为不同的分辨率?如32x8,48x12 ......等。
编辑: 例如,我将此作为我的绘图方法:
public void onDraw(Canvas canvas){
super.onDraw(canvas);
for(int x = 0; x < 4; x++){
for(int y = 0; y < 16; y++){
// mapping 2D array to 1D array
int index = x*GRID_WIDTH + y;
tempVal = currentTemperatureValues.get(index);
// 68x68 bitmap squares to display temperature data
if(tempVal >= 40.0)
bitmaps[x][y].eraseColor(Color.RED);
else if(tempVal < 40.0 && tempVal > 35.0)
bitmaps[x][y].eraseColor(Color.YELLOW);
else
bitmaps[x][y].eraseColor(Color.BLUE);
}
}
combinedBitmap = mergeBitmaps();
// combinedBitmap = fastblur(combinedBitmap, 45);
paint.setAlpha(alphaValue);
canvas.drawBitmap(combinedBitmap, xBitmap, yBitmap, paint);
Log.i(TAG,"Done drawing");
}
目前的实现是在我的相机预览上绘制一个16x4叠加,但分辨率非常低,我想尽我所能地改进它。
答案 0 :(得分:0)
Android API中的Bitmap
类(我假设你正在使用的那个)有一个名为createScaledBitmap
的静态方法:http://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap%28android.graphics.Bitmap,%20int,%20int,%20boolean%29
此方法的作用是接受已创建的Bitmap
,指定最终的宽度和高度尺寸以及名为boolean
的{{1}}标记。将此设置为filter
会进行最近邻插值,而false
进行双线性插值。
举个例子,假设你有一个true
的二维数组,你可以像这样重新调整一个:
Bitmap
第一个参数是要调整大小的Bitmap resize = Bitmap.createScaledBitmap(bitmaps[x][y], 32, 8, true);
,第二个参数是宽度,第三个参数是高度,最后一个是Bitmap
标志。输出(当然)存储在filter
中,是您调整大小/缩放的图像。目前,此方法的Javadoc(如您所见)没有解释resize
的作用。我不得不查看Android源代码来弄清楚它到底在做什么,以及我之前使用过该方法的经验。
通常情况下,如果您缩小图片,则将其设置为filter
,而如果您升级,则将其设置为false
图片。原因是因为当您将图像从小到大插值时,您尝试创建的信息比最初可用的信息多。使用最近邻居执行此操作将引入块效应,因此双线性插值将有助于平滑此问题。从大到小都没有使用任何一种方法的明显伪影,因此您通常选择最近邻居,因为它的计算效率更高。当你调整到更大的图像时,显然会有模糊。你去的越大,你得到的就越模糊,但是这比你最近邻居的那种阻碍要好。
仅使用Android API,这是您可以获得的最佳和最简单的解决方案。如果你想进入更复杂的插值技术(Cubic,Lanczos等......),不幸的是你必须自己实现它。先试试双线性,看看你得到了什么。