MySQL 原生並不支持 bitmap 類型,所以就只能存字元串,然後就根據你的 bitmap 長度以及轉換方式來選擇是用什麼類型來存儲,處理的過程在代碼層面完成。
我簡單說下我們做同樣的事情的做法,不一定是好方法,可以一起探討。
首先,我們操作資料庫的語言是 PHP。使用的是 ASCII 表裡的 0 ~ 127位的字元,所以每一個字元可以存 8bits,然後用一個 char(125) 來存 bitmap 的一個片段,每個片段可以存 1000bits。
通過 PHP 計算某一位在那一個片段的第幾位,例如 2345,就在第三個片段的第345位(從1開始的話),然後通過 PHP 進行更新。當然,也可以直接用 SQL 更新,SQL 語句寫起來比較麻煩,我寫了半天才寫出來:
unhex(conv(bin(conv(hex(STR1),16,10)|conv(hex(STR2),16,10)),2,16))
不過我們用 MySQL 存儲也就是為了確保數據的安全性,大部分的查詢操作都在 redis 裡面完成,redis 原生支持 bitmap 用起來又高效又方便。
B. 請問AS3.0 怎樣可以將Bitmap對象保存為本地圖片文件(如JPG文件)。謝謝!
在FLASH
PLAYER10之前比較麻煩
但現在依靠FP10簡單實現
在FLASH
CS4↑版本,若要導出圖片,可以這樣寫
var
file:FileReference
=
new
FileReference();
file.save(要保存的數據,"保存的文件名");
(如file.save("test",
"test.txt"),然後保存在桌面
保存完成後會在桌面看到一個內容為test的文本)
然後會彈出WINODWS的保存窗口,選擇路徑,保存完成~
C. 關於保存Bitmap的問題
一個app有限制內存空間,以前我做圖片保存的時候也出過這樣的問題,因為程序內存佔用過多而直接導致內存溢出,你這個如果無法保存應該跟我的錯誤差不多,也應該是內存大小的一個問題.
D. 為什麼點陣圖存儲數據最後要填充兩個位元組0
BMP文件的數據按照從文件頭開始的先後順序分為四個部分:
◆ 點陣圖文件頭(bmp file header): 提供文件的格式、大小等信息
◆ 點陣圖信息頭(bitmap information):提供圖像數據的尺寸、位平面數、壓縮方式、顏色索引等信息
◆ 調色板(color palette):可選,如使用索引來表示圖像,調色板就是索引與其對應的顏色的映射表
◆ 點陣圖數據(bitmap data):圖像數據區
BMP文件頭結構體定義如下:
typedef struct tagBITMAPFILEHEADER
{ UINT16 bfType; //2Bytes,必須為"BM",即0x424D 才是Windows點陣圖文件
DWORD bfSize; //4Bytes,整個BMP文件的大小
UINT16 bfReserved1; //2Bytes,保留,為0
UINT16 bfReserved2; //2Bytes,保留,為0
DWORD bfOffBits; //4Bytes,文件起始位置到圖像像素數據的位元組偏移量} BITMAPFILEHEADER;
BMP信息頭結構體定義如下:
typedef struct _tagBMP_INFOHEADER
{DWORD biSize; //4Bytes,INFOHEADER結構體大小,存在其他版本I NFOHEADER,用作區分
LONG biWidth; //4Bytes,圖像寬度(以像素為單位)
LONG biHeight; //4Bytes,圖像高度,+:圖像存儲順序為Bottom2Top,-:Top2Bottom
WORD biPlanes; //2Bytes,圖像數據平面,BMP存儲RGB數據,因此總為1
WORD biBitCount; //2Bytes,圖像像素位數
DWORD biCompression; //4Bytes,0:不壓縮,1:RLE8,2:RLE4
DWORD biSizeImage; //4Bytes,4位元組對齊的圖像數據大小
LONG biXPelsPerMeter; //4 Bytes,用象素/米表示的水平解析度
LONG biYPelsPerMeter; //4 Bytes,用象素/米表示的垂直解析度
DWORD biClrUsed; //4 Bytes,實際使用的調色板索引數,0:使用所有的調色板索引
DWORD biClrImportant; //4 Bytes,重要的調色板索引數,0:所有的調色板索引都重要
}BMP_INFOHEADER;
BMP調色板結構體定義如下:
typedef struct _tagRGBQUAD
{BYTE rgbBlue; //指定藍色強度
BYTE rgbGreen; //指定綠色強度
BYTE rgbRed; //指定紅色強度
BYTE rgbReserved; //保留,設置為0} RGBQUAD;
1,4,8點陣圖像才會使用調色板數據,16,24,32點陣圖像不需要調色板數據,即調色板最多隻需要256項(索引0 - 255)。
顏色表的大小根據所使用的顏色模式而定:2色圖像為8位元組;16色圖像位64位元組;256色圖像為1024位元組。其中,每4位元組表示一種顏色,並以B(藍色)、G(綠色)、R(紅色)、alpha(32位點陣圖的透明度值,一般不需要)。即首先4位元組表示顏色號1的顏色,接下來表示顏色號2的顏色,依此類推。
顏色表中RGBQUAD結構數據的個數有biBitCount來確定,當biBitCount=1,4,8時,分別有2,16,256個表項。
當biBitCount=1時,為2色圖像,BMP點陣圖中有2個數據結構RGBQUAD,一個調色板佔用4位元組數據,所以2色圖像的調色板長度為2*4為8位元組。
當biBitCount=4時,為16色圖像,BMP點陣圖中有16個數據結構RGBQUAD,一個調色板佔用4位元組數據,所以16像的調色板長度為16*4為64位元組。
當biBitCount=8時,為256色圖像,BMP點陣圖中有256個數據結構RGBQUAD,一個調色板佔用4位元組數據,所以256色圖像的調色板長度為256*4為1024位元組。
當biBitCount=16,24或32時,沒有顏色表。
BMP圖像數據區
點陣圖數據記錄了點陣圖的每一個像素值,記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。點陣圖的一個像素值所佔的位元組數:
當biBitCount=1時,8個像素佔1個位元組;
當biBitCount=4時,2個像素佔1個位元組;
當biBitCount=8時,1個像素佔1個位元組;
當biBitCount=24時,1個像素佔3個位元組;
Windows規定一個掃描行所佔的位元組數必須是4的倍數(即以long為單位),不足的以0填充,
一個掃描行所佔的位元組數計算方法:
DataSizePerLine= (biWidth* biBitCount+31)/8;
// 一個掃描行所佔的位元組數
DataSizePerLine= DataSizePerLine/4*4; // 位元組數必須是4的倍數
點陣圖數據的大小(不壓縮情況下):
DataSize= DataSizePerLine* biHeight;
顏色表接下來位為點陣圖文件的圖像數據區,在此部分記錄著每點像素對應的顏色號,其記錄方式也隨顏色模式而定,既2色圖像每點佔1位(8位為1位元組);16色圖像每點佔4位(半位元組);256色圖像每點佔8位(1位元組);真彩色圖像每點佔24位(3位元組)。所以,整個數據區的大小也會隨之變化。究其規律而言,可的出如下計算公式:圖像數據信息大小=(圖像寬度*圖像高度*記錄像素的位數)/8。
E. android中Bitmap存為一張圖片
可以用Bitmap.compress函數來把Bitmap對象保存成PNG或JPG文件,然後可以用BitmapFactory把文件中的數據讀進來再生成Bitmap對象。
保存的代碼大概類似於這樣:
try {
FileOutputStream out = new FileOutputStream(filename);
bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
e.printStackTrace();
}
具體的可以去查Bitmap和BitmapFactory的幫助文檔。
F. C#Bitmap 對於像 如何保存為16進制數據
用二進制方式,打開Bitmap文件,然後用Read函數讀出,其內容就是16進制數據,然後保存到文本中也好,資料庫中也好.
G. C#中圖片已經保存於Bitmap中,如何實現將該Bitmap圖像保存在本地磁碟
實現將該Bitmap圖像保存在本地磁碟的操作步驟如下:
1、在Bitmap中編輯代碼。首先編輯頭代碼:
public static void saveBitmap(Bitmap bitmap,int path)。
H. Bitmap 究竟佔多大內存
最近在做一款塔防游戲,用的事surfaceview框架,由於圖片過多,而且游戲過程中都需要這些圖片,所以載入成bitmap後造成OOM(outofmemory)異常。下面是我一步一步找解決此問題的紀錄,再此分享,希望對以後出現此問題的開發者有所幫助。第一:出現問題,我的測試手機是2。2android操作系統,不會出現oom問題,但是在老闆的android4.2上卻出現了問題,因為是oom,所以我首先想到的是手動改變手機的內存大小限制。網上有些帖子說可以通過函數設置應用的HEAPSIZE來解決這個問題,其實是不對的。VMRuntime.getRuntime().setMinimumHeapSize(NewSize);堆(HEAP)是VM中佔用內存最多的部分,通常是動態分配的。堆的大小不是一成不變的,通常有一個分配機制來控制它的大小。比如初始的HEAP是4M大,當4M的空間被佔用超過75%的時候,重新分配堆為8M大;當8M被佔用超過75%,分配堆為16M大。倒過來,當16M的堆利用不足30%的時候,縮減它的大小為8M大。重新設置堆的大小,尤其是壓縮,一般會涉及到內存的拷貝,所以變更堆的大小對效率有不良影響。MaxHeapSize,是堆內存的上限值,Android的預設值是16M(某些機型是24M),對於普通應用這是不能改的。函數setMinimumHeapSize其實只是改變了堆的下限值,它可以防止過於頻繁的堆內存分配,當設置最小堆內存大小超過上限值時仍然採用堆的上限值,對於內存不足沒什麼作用。setTargetHeapUtilization(floatnewTarget)可以設定內存利用率的百分比,當實際的利用率偏離這個百分比的時候,虛擬機會在GC的時候調整堆內存大小,讓實際佔用率向個百分比靠攏。在手機上進行了多次測試,確實不好使,在此,我斷了改變內存限制的方法。第二:查找出現問題的原因。1,在網上搜索bitmap內存溢出,找到很多說是因為圖片大小引起的此問題。觀察我的資源文件,沒有太大的圖片,只是圖片數量過多,有將近900張,分別找出一張最大的圖片和幾張比較大的圖片,單獨測試,沒有發現問題。方法1排除。2,既然圖片數量過多,突破點可能就是圖片數量問題。於是分別找了200,400,600圖片進行測試,在500左右的時候遇到錯誤,通過寶哥知道了將小圖片整合存放到一張大圖的方法,以此來減少圖片的數量,但是仔細想想,載入成bitmap的時候還是要切割成小圖生成bitmap,所以對此方法表示懷疑。由於以前沒用過此方法,試試也無妨。所用到的工具是gdx—texturepackger,它只是一個工具,這里就不多說了。測試的最終結果是還是oom。方法2排除。3,現在看來,既然不是圖片數量的問題,而且會在500張左右的時候報錯,那就可能是佔用內存大小的問題了,Android手機有內存限制,但是我的圖片大小又大於這個限制,這讓我頭疼了很長時間,研究國外的一些文章,從中發現了一些有用的信息,這些信息能夠加深你對Android的解析bitmap機制的理解,在此分享:.作為蜂窩點陣圖數據是在VM分配堆。)(whichissmall),ibrary.有一個引用在VM堆(小),但實際的數據是在本機堆分配由底層Skia圖形庫。Unfortunately,.decode…(),theSkiaimplementation()logsthemessageyou』reseeing(「VMwon』tletusallocatexxxxbytes」)「bitmapsizeexceedsVMbudget」.不幸的是,雖然BitmapFactory.decode的定義…()表示,它返回null如果圖像數據不能解碼,Skia實現(或者說JNI膠之間的Java代碼和Skia)日誌消息你看到(「VM不會讓我們分配xxxx位元組」),然後拋出一個OutOfMemory異常與誤導信息」點陣圖的大小超過VM預算」。.這個問題不是在VM堆而是在本機堆。TheNatï,bitmapusage.本機堆是正在運行的應用程序之間共享,因此空閑空間的大小取決於其他運行程序,他們使用的點陣圖。However,()andgetNativeHeapSize()arenotreliable.然而,我發現getNativeHeapFreeSize()和getNativeHeapSize()是不可靠的。.本機堆大小不同的平台。Soatstartup,apsize.所以在啟動時,我們檢查最大允許VM堆大小來確定最大允許本機堆大小。「」—「點陣圖數據不是在VM分配堆」——這是VM分配的堆在蜂窩Yes.是的。AsofHoneycomb(v3.0),.作為蜂窩(v3.0),點陣圖數據堆上分配VM。(v2.3.x)andbefore所以所有上述只適用於姜餅(v23x)和之前這些信息零零散散,但是不難發現,問題的原因就在於根據Android版本的不同,bitmapdata存放的位置是不同的,3.0以前是分配在nativeheap上,3.0以後是分配在VMheap上。
I. 請教 怎樣保存bitmap類型的數據
如果是我來解決這個問題的話,我會將這個bitmap對象存儲在資料庫里,下次啟動程序的時候,從資料庫中讀取bitmap對象就可以了。
J. Windows 無法為 E:\$BitMap 文件保存所有數據
無法為 \\Device\\HarddiskVolume5\\$文件保存所有數據。數據已經丟失。 這個錯誤可能是由於您的計算機硬體或網路連接的失敗而造成的。請嘗試把這份文件保存到別