slider

还是菜鸟
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用点数据包存你的绘图信息

Posted on 2011-12-06 21:03  slider  阅读(343)  评论(0编辑  收藏  举报

  这个是我实习的时候做的一个东西,写的是一个记事本。记事本里面的绘图数据本来是用图片形式包存的,后来听说可以用点数据可以保存。项目做的差不多了,反正闲着也是没有事情,所以就望这方面作了下。网上基本上是查不到这个资料的,就询问了下别人,探讨出了一个简单的思路,然后我就按照这个思路写出了些东西,下面就简单说下吧:

  用一串点的信息来包存你的绘图信息,特被是在画板应用中非常有效,很节省空间。比如在一个空白画板上你画了一条线,那么你只需要记录下你划线的坐标及画笔的相关信息即可。然而以点数据形式保存,虽然节省的空间小,并且可以保存到数据库里,缺点是交互性差,比如你传递到别人手机里,对方必须要有相同算法的软件才可以把点数据转化成可以看见的图片。

  整个思路如下图所示:

  如图所示,点的信息表示主要有二个方面:点的坐标widthheight,该点的画笔信息data(这里只有画笔宽度length,画笔的颜色color,事实上你可以写很多),在这个算法中了,我还加上了一个标记信息tag.这个tag很重要,有了它就可以为你节省很多数据空间。它只有两个值:011表示要读取完整数据,即一个点的全部信息;0表示之包含局部信息,其他的默认前一个点的信息。这样我就方便了,当我一条线的时候,我不必每保存一次点信息的时候就保存画笔的信息,只需要在开始的时候记录下来就可以了(事实上是每次画笔改变的时候你都需要重新保存一个画笔的信息,后面的点只需要默认前面点的画笔信息即可)

  整个算法的核心就是生成一个float[]来保存点数据信息和解析这个float数组。因为要包存到数据库,采用字节包存。所以就用到了floatbyte的转化工具,网上找了几个,发面下面的FloatUtil写的不错:

 

View Code
package slider.cn.FloatUtil;


public final class FloatUtil {

public static byte[] getBytes(float[] data){
byte[] temp=new byte[data.length*4];
int i=0;
int size = data.length;
while(i<size){
byte[] b = getByte(data[i]);
int index = i*4;
temp[index] = b[0];
temp[index+1] = b[1];
temp[index+2] = b[2];
temp[index+3] = b[3];
i = i+1;
}
return temp;
}
public static float[] getFloats(byte[] data){

float[] temp = new float[data.length/4];
int i=0;
int size = data.length;
while(i<size){
temp[i/4] =getFloat(data, i);
i = i+4;
}
return temp;
}
/**
* 通过byte数组取得float
*
*
@param bb
*
@param index
*
@return
*/
public static float getFloat(byte[] b, int index) {
int l;
l = b[index + 0];
l &= 0xff;
l |= ((long) b[index + 1] << 8);
l &= 0xffff;
l |= ((long) b[index + 2] << 16);
l &= 0xffffff;
l |= ((long) b[index + 3] << 24);
return Float.intBitsToFloat(l);
}

/**
* float转换byte
*
*
@param bb
*
@param x
*
@param index
*/
public static byte[] getByte(float x) {
byte[] b = new byte[4];
int l = Float.floatToIntBits(x);
for (int i = 0; i < 4; i++) {
b[i] = new Integer(l).byteValue();
l = l >> 8;
}
return b;
}
}

  为什么要用foat类型,而不用short,int类型呢?考虑到它的color值可能为负数,而width,height本生为float ,故采用float类型。

  先写道这里吧,因为是以前些的,以后有灵感再写把