用點資料包存你的繪圖資訊

來源:互聯網
上載者:User

  這個是我實習的時候做的一個東西,寫的是一個記事本。記事本裡面的繪圖資料本來是用圖片形式包存的,後來聽說可以用點資料可以儲存。項目做的差不多了,反正閑著也是沒有事情,所以就望這方面作了下。網上基本上是查不到這個資料的,就詢問了下別人,探討出了一個簡單的思路,然後我就按照這個思路寫出了些東西,下面就簡單說下吧:

  用一串點的資訊來包存你的繪圖資訊,特被是在畫板應用中非常有效,很節省空間的。比如在一個空白畫板上你畫了一條線,那麼你只需要記錄下你劃線的座標及畫筆的相關資訊即可。然而以點資料形式儲存,雖然節省的空間小,並且可以儲存到資料庫裡,缺點是互動性差,比如你傳遞到別人手機裡,對方必須要有相同演算法的軟體才可以把點資料轉化成可以看見的圖片。

  整個思路如所示:

  ,點的資訊表示主要有二個方面:點的座標width語height,該點的畫筆資訊data(這裡只有畫筆寬度length,畫筆的顏色color,事實上你可以寫很多),在這個演算法中了,我還加上了一個標記資訊tag.這個tag很重要,有了它就可以為你節省很多資料空間。它只有兩個值:0和1。1表示要讀取完整資料,即一個點的全部資訊;0表示之包含局部資訊,其他的預設前一個點的資訊。這樣我就方便了,當我一條線的時候,我不必每儲存一次點資訊的時候就儲存畫筆的資訊,只需要在開始的時候記錄下來就可以了(事實上是每次畫筆改變的時候你都需要重新儲存一個畫筆的資訊,後面的點只需要預設前面點的畫筆資訊即可)。

  整個演算法的核心就是產生一個float[]來儲存點資料資訊和解析這個float數組。因為要包存到資料庫,採用位元組包存。所以就用到了float與byte的轉化工具,網上找了幾個,發麵下面的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類型。

  先寫道這裡吧,因為是以前些的,以後有靈感再寫把

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.