線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2605
推到 Plurk!
推到 Facebook!

請問 TBitmapInfo 的內容, 怎樣放去 TImage 內 ?

尚未結案
MatthewSong
一般會員


發表:17
回覆:17
積分:6
註冊:2007-09-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-02-01 17:37:46 IP:202.175.xxx.xxx 訂閱
因為我有一個dll, 是c++ 寫的, 他的返回值是 LPBITMAPINFO lpBMI;

即是 TBitmapInfo, 我想問一下

在 delphi中 timage中的picture.Bitmap如何取得 此內容?

謝謝
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-02-01 19:41:09 IP:114.32.xxx.xxx 訂閱
也是網路上看來的

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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-02-02 08:50:12 IP:202.175.xxx.xxx 訂閱
我是擁有 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-02-03 09:43:46 IP:59.120.xxx.xxx 訂閱
你現在這樣回我 是說我目洨 沒搞清楚狀況是不是 ?!
少來這套,你原文明明就是寫

即是 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-02-03 14:27:09 IP:202.175.xxx.xxx 訂閱
不好意思, 可能是我自己表達有問題, 對不起

應該說, 我從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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-03-18 14:06:05 IP:59.120.xxx.xxx 訂閱
一張圖片要能顯示出來,並且看得到,
你首先要了解圖的架構為何?
除了要設定"檔頭"外, 還要"調色盤" & "像素點"資訊,
當都設定完後,就是你想希望的結果了
我這邊提供一個灰階檔頭的範例 , 你可以好好研究一下,不過
很抱歉 , 我不會寫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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-07-03 17:21:35 IP:116.59.xxx.xxx 訂閱
我所知道的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 ]

系統時間:2017-12-17 20:03:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!