請教如何 "不經判斷" 將 TPicture 轉成 TBitmap |
答題得分者是:jest0024
|
kaworu
一般會員 發表:7 回覆:6 積分:2 註冊:2005-05-17 發送簡訊給我 |
這功能主要是要將圖片塞進資料庫
由於圖片是 Load 到 DBImage->Picture ,所以 DBImage->Picture->Bitmap 是空的
會造成丟進資料庫時沒東西丟進去
因為想改將圖指定到 DBImage->Picture->Bitmap
所以我試過 DBImage->Picture->Bitmap->LoadFromFile( OpenPictureDialog->FileName )
但如果讀進來的是 JPEG 就會出錯
因此改成將圖讀進來後再轉成 BMP,之後再 Assign 給 DBImage->Picture->Bitmap
而我遇到的問題則是 DBImage->Picture 無法轉成 Bitmap,因為一個是 TPicture ,一個是 TBitmap
請問有什麼好方法能將 TPicture 的圖不問格式而轉成 TBitmap 嗎? 翻閲了站上一堆文章之後,我寫出來的方法如下:
if( OpenPictureDialog->Execute() ){ if( ExtractFileExt( OpenPictureDialog->FileName ) == ".jpg" || ExtractFileExt( OpenPictureDialog->FileName ) == ".jpeg" ){ TJPEGImage *jpeg = new TJPEGImage(); jpeg->LoadFromFile( OpenPictureDialog->FileName ); DBImage->Picture->Bitmap->Assign( jpeg ); jpeg->Free(); } else DBImage->Picture->LoadFromFile( OpenPictureDialog->FileName ); }這只是在讀取時判斷副檔名是不是 .jpg 或 .jpeg,如果是,就另外處理 我知道有個方法是先 >>>> > 除此之外還有什麼做法嗎?謝謝 發表人 - |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
kaworu 您好: 這是我使用的方式:
if (OpenPictureDialog->Execute()) { Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap(); AnsiString fName = OpenPictureDialog->FileName; AnsiString curExt = LowerCase(ExtractFileExt(fName)); if (curExt == ".jpg" || curExt == ".jpeg") { TJPEGImage *JPEG = new TJPEGImage; JPEG->LoadFromFile(fName); tmpBitmap->Assign(JPEG); delete JPEG; } else if(curExt == ".bmp") { tmpBitmap->LoadFromFile(fName); } DBImage->Picture->Bitmap->Assign(tmpBitmap); delete tmpBitmap; tmpBitmap = NULL; }以上程式是從我的程式中擷取出來修改成配合您的設定,但沒有再做過測試,不知修改過程有無疏漏?您先試試看吧。 發表人 - RedSnow 於 2005/05/28 03:37:27 |
kaworu
一般會員 發表:7 回覆:6 積分:2 註冊:2005-05-17 發送簡訊給我 |
RedSnow 您好:
您的作法可以,但其方法跟我寫的應該是相同的吧
原則上都是先判斷是否為 jpeg 圖,再分別處理 不過您的程式讓我注意到我所忽略的一件事,就是我的作法在讀取的副檔名有包含大寫字母的話,一樣會出錯
所以要先使用 > 另外,可否請教一下,為何您的程式中
在 > --------------------------------------------------------
可是我想知道的是有沒有什麼別的作法,<>可以不管讀入的檔案是什麼類型的圖片>,都直接轉成 class="code">
if (OpenPictureDialog->Execute()) {
DBImage->Picture->LoadFromFile( OpenPictureDialog->FileName );
DBImage->CopyToClipboard();
DBImage->PasteFromClipboard();
}
並不用判斷是什麼類型,直接就將圖片給貼回 DBImage->Picture->Bitmap 了
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
kaworu 您好: 抱歉誤解了您問題的重點所在,我以為您陷在使用 Picture 來讀 .bmp 檔的迷思裡,故提供一段直接使用 Bitmap 來讀檔的範例。 前一篇程式碼是我在凌晨準備爬上床之前 "剪接" 而成的,並未再度做過測試,因此有些疏漏,我現在的習慣是在 delete 之後再設成 NULL 處理,JPEG 未做相同處理係新舊寫作習慣不同,原本該段是寫在自定函式之中,在 delete 的動作後均未加上設成 NULL 處理,tmpBitmap 為傳回值,故函式內不做 delete 動作,為了配合您的範例,才予以修改並補上 delete 動作,因為現在的寫作習慣關係,故順手加上 NULL 的設定,JPEG 的刪除未做相同處理純係截自舊程式片斷且睡眼惺忪的關係,沒有特別的用意,請多包涵。 至於您的另一個問題,在我的經驗裡是有第三方元件有提供類似的動作,但是查看原始碼之後,其實也都還是在函式之中加上了相關的判斷動作,或是轉換的處理,只是終端介面包裝成比較好使用的函式而已。 透過 Clipboard 來轉換的動作,我剛才試了一下,確實可達到預期效果,如果能夠確定該動作不會有例外狀況的產生,或許可以將它寫成自定函式來使用,這樣應該也能提供較為方便的操作過程吧。
|
kaworu
一般會員 發表:7 回覆:6 積分:2 註冊:2005-05-17 發送簡訊給我 |
引言: Picture->Graphic Bmp->Canvas->Draw(0,0,DBImage->Picture->Graphic); 發表人 - jest0024 於 2005/05/28 13:13:22jest0024 您好: 這個方法的確完全符合標題的 TPicture 轉成 TBitmap.....( 我改一下標題好了.....(~ = =)~ ) 但卻不適用我現在的問題 剛剛試了一下,我的 Graphic 無法讀取 JPEG 圖檔 若要讓 Graphic 可以讀取圖檔,那依我的做法,還是要先判斷是否為 JPEG 圖 這麼一來,問題又回到了原點,還是要做判斷 或是有其他的方法可以直接讓 Graphic 可以讀取 JPEG 圖嗎? 以下是我用來測試的程式碼: 讀取 bmp 的話正常運作 if( OpenPictureDialog->Execute() ){ DBImage->Picture->Graphic->LoadFromFile( OpenPictureDialog->FileName ); DBImage->Picture->Bitmap->Canvas->Draw( 0, 0, DBImage->Picture->Graphic ); }發表人 - kaworu 於 2005/05/28 14:45:19 |
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
引言:DBImage->Picture->LoadFromFile( OpenPictureDialog->FileName ); 發表人 - jest0024 於 2005/05/28 16:10:01引言: Picture->Graphic Bmp->Canvas->Draw(0,0,DBImage->Picture->Graphic); 發表人 - jest0024 於 2005/05/28 13:13:22jest0024 您好: 這個方法的確完全符合標題的 TPicture 轉成 TBitmap.....( 我改一下標題好了.....(~ = =)~ ) 但卻不適用我現在的問題 剛剛試了一下,我的 Graphic 無法讀取 JPEG 圖檔 若要讓 Graphic 可以讀取圖檔,那依我的做法,還是要先判斷是否為 JPEG 圖 這麼一來,問題又回到了原點,還是要做判斷 或是有其他的方法可以直接讓 Graphic 可以讀取 JPEG 圖嗎? 以下是我用來測試的程式碼: 讀取 bmp 的話正常運作if( OpenPictureDialog->Execute() ){ DBImage->Picture->Graphic->LoadFromFile( OpenPictureDialog->FileName ); DBImage->Picture->Bitmap->Canvas->Draw( 0, 0, DBImage->Picture->Graphic );//無法同一物件繪製!須建立另一BMP }發表人 - kaworu 於 2005/05/28 14:45:19 |
kaworu
一般會員 發表:7 回覆:6 積分:2 註冊:2005-05-17 發送簡訊給我 |
jest0024 您好: 原來不能繪製本身別的屬性裡的圖啊
稍微修正一下,是可以讀了
不過又發現一個新的問題
就是第一張圖讀的是 class="code">
if( OpenPictureDialog->Execute() ){
TPicture *picture = new TPicture();
picture->LoadFromFile( OpenPictureDialog->FileName );
DBImage->Picture->Bitmap->Canvas->Draw( 0, 0, picture->Graphic );
delete picture;
picture = NULL;
}
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
if( OpenPictureDialog->Execute() ){ TBitmap *bitmap = new TBitmap(); DBImage->Picture->LoadFromFile( OpenPictureDialog->FileName ); bitmap->Width = DBImage->Picture->Width; bitmap->Height = DBImage->Picture->Height; bitmap->Canvas->Draw(0,0,DBImage->Picture->Graphic); DBImage->Picture->Bitmap->Assign(bitmap); delete bitmap; bitmap = NULL; } |
kaworu
一般會員 發表:7 回覆:6 積分:2 註冊:2005-05-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |