請問 TBitmapInfo 的內容, 怎樣放去 TImage 內 ? |
尚未結案
|
MatthewSong
一般會員 發表:17 回覆:17 積分:6 註冊:2007-09-24 發送簡訊給我 |
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
|
MatthewSong
一般會員 發表:17 回覆:17 積分:6 註冊:2007-09-24 發送簡訊給我 |
我是擁有 TbitmapINFO 想轉成tbitmap
===================引 用 pprayer 文 章=================== 也是網路上看來的 Info : PBitmapInfo; InfoSize : DWORD; ImageSize : DWORD; Bits : HBITMAP; Bits :=TBitmap.Handle; GetDIBSizes(Bits, InfoSize, ImageSize); Info := AllocMem(InfoSize); |
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
你現在這樣回我 是說我目洨 沒搞清楚狀況是不是 ?!
少來這套,你原文明明就是寫 「 即是 TBitmapInfo, 我想問一下 在 delphi中 timage中的picture.Bitmap如何取得 此內容? 」 我就是針對這點回的 ===================引 用 MatthewSong 文 章=================== 我是擁有 TbitmapINFO 想轉成tbitmap ===================引 用 pprayer 文 章=================== 也是網路上看來的 Info : PBitmapInfo; InfoSize : DWORD; ImageSize : DWORD; Bits : HBITMAP; Bits :=TBitmap.Handle; GetDIBSizes(Bits, InfoSize, ImageSize); Info := AllocMem(InfoSize); |
MatthewSong
一般會員 發表:17 回覆:17 積分:6 註冊:2007-09-24 發送簡訊給我 |
不好意思, 可能是我自己表達有問題, 對不起
應該說, 我從dll 得到 TBitmapInfo 的東西, 我想放在 timage中的picture.Bitmap, 可以讓人們看到這圖片 這一步我不太懂 ===================引 用 pprayer 文 章=================== 你現在這樣回我 是說我目洨 沒搞清楚狀況是不是 ?! 少來這套,你原文明明就是寫 「 即是 TBitmapInfo, 我想問一下 在 delphi中 timage中的picture.Bitmap如何取得 此內容? 」 我就是針對這點回的 ===================引 用 MatthewSong 文 章=================== 我是擁有 TbitmapINFO 想轉成tbitmap ===================引 用 pprayer 文 章=================== 也是網路上看來的 Info : PBitmapInfo; InfoSize : DWORD; ImageSize : DWORD; Bits : HBITMAP; Bits :=TBitmap.Handle; GetDIBSizes(Bits, InfoSize, ImageSize); Info := AllocMem(InfoSize); |
g9412747
初階會員 發表:3 回覆:28 積分:36 註冊:2009-02-25 發送簡訊給我 |
一張圖片要能顯示出來,並且看得到,
你首先要了解圖的架構為何? 除了要設定"檔頭"外, 還要"調色盤" & "像素點"資訊, 當都設定完後,就是你想希望的結果了 我這邊提供一個灰階檔頭的範例 , 你可以好好研究一下,不過 很抱歉 , 我不會寫Delphi ,我提供的是BCB的檔頭範例,但我想原理是一樣的! [code cpp] //---------------- 給 Image 灰階檔頭 ---------------------// void func_bmp_gray_header_declare( int width, int height, Graphics::TBitmap *NewBmp) { byte *HeaderBuffer = new byte[1078]; TMemoryStream *TmpStream = new TMemoryStream; memset( HeaderBuffer, 0, 1078); TmpStream->Position = 0; TmpStream->Read(HeaderBuffer, 1078); // BITMAPFILEHEADER *(HeaderBuffer 0) = 'B'; *(HeaderBuffer 1) = 'M'; // bfType 為 BM *(HeaderBuffer 10) = 54; *(HeaderBuffer 11) = 4; // 灰階資料區塊位移值 1078 = 4*256 54 // BITMAPINFOHEADER *(HeaderBuffer 14) = 40; // 14~17 為圖形描述塊大小 40 bytes // 影像寬度 18~21 *(HeaderBuffer 21) = floor((float)width/(2<<(8*3-1))); *(HeaderBuffer 20) = floor((float)(width-*(HeaderBuffer 21)*(2<<(8*3-1)))/(2<<(8*2-1))); *(HeaderBuffer 19) = floor((float)(width-*(HeaderBuffer 21)*(2<<(8*3-1)) - *(HeaderBuffer 20)*(2<<(8*2-1)) )/(2<<(8*1-1))); *(HeaderBuffer 18) = width - (*(HeaderBuffer 21)*(2<<(8*3-1)) *(HeaderBuffer 20)*(2<<(8*2-1)) *(HeaderBuffer 19)*(2<<(8*1-1))); // 影像高度 22~24 *(HeaderBuffer 25) = floor((float)height/(2<<(8*3-1))); *(HeaderBuffer 24) = floor((float)(height-*(HeaderBuffer 25)*(2<<(8*3-1)))/(2<<(8*2-1))); *(HeaderBuffer 23) = floor((float)(height-*(HeaderBuffer 25)*(2<<(8*3-1)) - *(HeaderBuffer 24)*(2<<(8*2-1)) )/(2<<(8*1-1))); *(HeaderBuffer 22) = height - (*(HeaderBuffer 25)*(2<<(8*3-1)) *(HeaderBuffer 24)*(2<<(8*2-1)) *(HeaderBuffer 23)*(2<<(8*1-1))); *(HeaderBuffer 26) = 1; // 26~27 biPlanes *(HeaderBuffer 28) = 8; // 28~29 biBitCount 每個像素用幾個位元 *(HeaderBuffer 30) = 0; // 30~33 為圖檔壓縮方式 *(HeaderBuffer 38) = 0; // 38~41 為影像水平解析度 *(HeaderBuffer 42) = 0; // 42~45 為影像垂直解析度 *(HeaderBuffer 46) = 0; // 46~49 為調色盤所用到的顏色總數,即 2^biBitcount *(HeaderBuffer 47) = 1; // 表示僅用到 256 色 *(HeaderBuffer 50) = 0; // 50~53 為重要顏色的總數,越重要放越前面 // 影像資料區塊所佔空間 int totalbytes = 4*ceil((float)width/4)*height; *(HeaderBuffer 37) = floor((float)totalbytes/(2<<(8*3-1))); *(HeaderBuffer 36) = floor((float)(totalbytes-*(HeaderBuffer 37)*(2<<(8*3-1)))/(2<<(8*2-1))); *(HeaderBuffer 35) = floor((float)(totalbytes-*(HeaderBuffer 37)*(2<<(8*3-1)) - *(HeaderBuffer 36)*(2<<(8*2-1)) )/(2<<(8*1-1))); *(HeaderBuffer 34) = totalbytes - (*(HeaderBuffer 37)*(2<<(8*3-1)) *(HeaderBuffer 36)*(2<<(8*2-1)) *(HeaderBuffer 35)*(2<<(8*1-1))); // 影像標頭檔及資料區塊所佔空間 totalbytes = totalbytes 1078; *(HeaderBuffer 5) = floor((float)totalbytes/(2<<(8*3-1))); *(HeaderBuffer 4) = floor((float)(totalbytes-*(HeaderBuffer 5)*(2<<(8*3-1)))/(2<<(8*2-1))); *(HeaderBuffer 3) = floor((float)(totalbytes-*(HeaderBuffer 5)*(2<<(8*3-1)) - *(HeaderBuffer 4)*(2<<(8*2-1)) )/(2<<(8*1-1))); *(HeaderBuffer 2) = totalbytes - (*(HeaderBuffer 5)*(2<<(8*3-1)) *(HeaderBuffer 4)*(2<<(8*2-1)) *(HeaderBuffer 3)*(2<<(8*1-1))); // 設定灰階調色盤 int graydata = 0; for(int i = 54; i < 1078; i = i 4) { *(HeaderBuffer i 0) = graydata; *(HeaderBuffer i 1) = graydata; *(HeaderBuffer i 2) = graydata ; } TmpStream->Position = 0; TmpStream->Write(HeaderBuffer, 1078); TmpStream->Position = 0; NewBmp->LoadFromStream(TmpStream); delete TmpStream; delete HeaderBuffer; }[/code] |
wgbird
一般會員 發表:0 回覆:4 積分:0 註冊:2010-07-01 發送簡訊給我 |
我所知道的TBitmapInfo只是 Bitmap檔頭的訊息,還需要Bitmap 的Bits,
參考一下我以前做的影像伺服器所傳回的資料,我轉成Bitmap貼在Image上 某些API的用法請參考Windows API的說明 因為我還不夠格教導這些東東, 免得誤人子弟 [ code xxxx ] const SCREEN_WIDTH = 320; SCREEN_HEIGHT = 240; WIDTH = 320; HEIGHT = 240; var MyBitMap:TBitmap ; bmpInfo:TBitmapInfo ; pBuffer:Pointer; //圖片資料的指標 implementation procedure TForm1.FormCreate(Sender: TObject); begin bmpInfo.bmiHeader.biSize := sizeof( bmpInfo.bmiHeader ); bmpInfo.bmiHeader.biWidth := 0; bmpInfo.bmiHeader.biHeight := 0; bmpInfo.bmiHeader.biPlanes := 1; bmpInfo.bmiHeader.biBitCount := 24; bmpInfo.bmiHeader.biCompression := BI_RGB; bmpInfo.bmiHeader.biSizeImage := 0; bmpInfo.bmiHeader.biXPelsPerMeter := 0; bmpInfo.bmiHeader.biYPelsPerMeter := 0; bmpInfo.bmiHeader.biClrUsed := 0; bmpInfo.bmiHeader.biClrImportant := 0; MyBitMap:=TBitmap.Create ; MyBitMap.PixelFormat:=pf24bit ; MyBitMap.Width:=SCREEN_WIDTH ; //Bitmap的寬度 MyBitMap.Height:=SCREEN_HEIGHT; //Bitmap的高度 end; procedure TForm1.Button1Click(Sender: TObject); begin bmpInfo.bmiHeader.biWidth := WIDTH; //Memory 內圖片的寬度 bmpInfo.bmiHeader.biHeight := HEIGHT; //Memory 內圖片的高度 SetStretchBltMode( MyBitMap.Canvas.Handle, COLORONCOLOR ); StretchDIBits ( MyBitMap.Canvas.Handle, 0, SCREEN_HEIGHT - 1, SCREEN_WIDTH, -SCREEN_HEIGHT, 0, 0, bmpInfo.bmiHeader.biWidth, bmpInfo.bmiHeader.biHeight, pBuffer, bmpInfo, DIB_RGB_COLORS, SRCCOPY ); Image1.Picture.Assign(MyBitMap); //將轉換的MyBitMap指給Image1 end; [/code ] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |