如何在每个像素中创建包含信息的位图?

时间:2013-04-28 10:54:39

标签: java android google-maps bitmap

我正在Android上创建一个谷歌地图应用程序,但我遇到了问题。我有文本格式的高程数据。看起来像这样

longtitude latitude elevation
491222     163550   238.270000
491219     163551   242.130000
etc.

此高程信息存储在10x10米的网格中。这意味着每10米就是一个高程值。这段文字太大,以至于我找不到我需要的信息,所以我想用这些信息创建一个位图。

我需要做的是在某个时刻扫描我所在位置的高程。可以有很多要扫描的点,所以我想快速完成。这就是为什么我在考虑位图。

我不知道它是否可能,但我的想法是我的文本网格有一个大小的位图,并且在每个像素中都有关于高程的信息。因此它应该像根据坐标放置在地图上的谷歌地图上的隐形地图,当我需要了解有关我的位置的高程时,我会只看这些像素并读取高程值。

您认为可以创建这样的位图吗?我有这个想法,但不知道如何实现它。例如,如何在其中存储高程信息,如何阅读,如何创建位图..我将非常感谢您可以给我的每一个建议,方向,来源。非常感谢你!

2 个答案:

答案 0 :(得分:0)

具有红色,绿色,蓝色和alpha(不透明度/透明度)的颜色。从所有像素透明开始。并将相应的值填入(R,G,B),非透明(高八位。(或“未填写”的其他约定。

RGB构成整数的低24位。

x和y的经度和纬度

提升到整数减去0x01_00_00_00。反之亦然:

double elevation = 238.27;
int code = (int)(elevation * 100);
Color c = new Color(code); // BufferedImage uses int, so 'code' sufThat does not fices.
code = c.getRGB();
elevation = ((double)code) / 100;  

具有setRGB(code)左右的BufferedImage(有不同的可能性)。

使用Oracles javadoc,通过google搜索BufferedImage等。

要填充未使用的像素,请在第二个BufferedImage中进行修改。所以永远不要平均到原始像素。

P.S。对于我的荷兰海拔高度可能小于零,所以也许+ ...。

答案 1 :(得分:0)

BufferedImage在Android中不可用,但可以使用android.graphics.Bitmap。位图必须以无损格式保存(例如PNG)。

double[] elevations={238.27,242.1301,222,1};
int[] pixels = doublesToInts(elevations);

    //encoding
Bitmap bmp=Bitmap.createBitmap(2, 2, Config.ARGB_8888);
bmp.setPixels(pixels, 0, 2, 0, 0, 2, 2);
File file=new File(getCacheDir(),"bitmap.png");
try {
    FileOutputStream fos = new FileOutputStream(file);
    bmp.compress(CompressFormat.PNG, 100, fos);
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

//decoding
Bitmap out=BitmapFactory.decodeFile(file.getPath());
if (out!=null)
{   
    int [] outPixels=new int[out.getWidth()*out.getHeight()];
    out.getPixels(outPixels, 0, out.getWidth(), 0, 0, out.getWidth(), out.getHeight());
    double[] outElevations=intsToDoubles(outPixels);
}

static int[] doublesToInts(double[] elevations)
{
    int[] out=new int[elevations.length];
    for (int i=0;i<elevations.length;i++)
    {
        int tmp=(int) (elevations[i]*1000000);          
        out[i]=0xFF000000|tmp>>8;
    }
    return out;
}
static double[] intsToDoubles(int[] pixels)
{
    double[] out=new double[pixels.length];
    for (int i=0;i<pixels.length;i++)
        out[i]=(pixels[i]<<8)/1000000.0;
    return out;
}