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

請教如何 "不經判斷" 將 TPicture 轉成 TBitmap

答題得分者是:jest0024
kaworu
一般會員


發表:7
回覆:6
積分:2
註冊:2005-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-28 03:08:43 IP:203.73.xxx.xxx 未訂閱
這功能主要是要將圖片塞進資料庫 由於圖片是 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-28 03:34:03 IP:218.19.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-28 11:20:25 IP:203.73.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-28 12:54:44 IP:211.74.xxx.xxx 未訂閱
Picture->Graphic Bmp->Canvas->Draw(0,0,DBImage->Picture->Graphic); 發表人 - jest0024 於 2005/05/28 13:13:22
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-28 13:42:29 IP:61.140.xxx.xxx 未訂閱
kaworu 您好:    抱歉誤解了您問題的重點所在,我以為您陷在使用 Picture 來讀 .bmp 檔的迷思裡,故提供一段直接使用 Bitmap 來讀檔的範例。    前一篇程式碼是我在凌晨準備爬上床之前 "剪接" 而成的,並未再度做過測試,因此有些疏漏,我現在的習慣是在 delete 之後再設成 NULL 處理,JPEG 未做相同處理係新舊寫作習慣不同,原本該段是寫在自定函式之中,在 delete 的動作後均未加上設成 NULL 處理,tmpBitmap 為傳回值,故函式內不做 delete 動作,為了配合您的範例,才予以修改並補上 delete 動作,因為現在的寫作習慣關係,故順手加上 NULL 的設定,JPEG 的刪除未做相同處理純係截自舊程式片斷且睡眼惺忪的關係,沒有特別的用意,請多包涵。 至於您的另一個問題,在我的經驗裡是有第三方元件有提供類似的動作,但是查看原始碼之後,其實也都還是在函式之中加上了相關的判斷動作,或是轉換的處理,只是終端介面包裝成比較好使用的函式而已。 透過 Clipboard 來轉換的動作,我剛才試了一下,確實可達到預期效果,如果能夠確定該動作不會有例外狀況的產生,或許可以將它寫成自定函式來使用,這樣應該也能提供較為方便的操作過程吧。
kaworu
一般會員


發表:7
回覆:6
積分:2
註冊:2005-05-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-28 14:42:00 IP:203.73.xxx.xxx 未訂閱
引言: Picture->Graphic Bmp->Canvas->Draw(0,0,DBImage->Picture->Graphic); 發表人 - jest0024 於 2005/05/28 13:13:22
jest0024 您好: 這個方法的確完全符合標題的 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-28 15:59:44 IP:211.74.xxx.xxx 未訂閱
引言:
引言: Picture->Graphic Bmp->Canvas->Draw(0,0,DBImage->Picture->Graphic); 發表人 - jest0024 於 2005/05/28 13:13:22
jest0024 您好: 這個方法的確完全符合標題的 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
DBImage->Picture->LoadFromFile( OpenPictureDialog->FileName ); 發表人 - jest0024 於 2005/05/28 16:10:01
kaworu
一般會員


發表:7
回覆:6
積分:2
註冊:2005-05-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-28 17:08:11 IP:59.104.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-28 20:12:16 IP:211.74.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-28 20:45:42 IP:203.73.xxx.xxx 未訂閱
直接修改屬性啊..... 謝謝 jest0024,對於這個方法,我沒問題了
系統時間:2024-06-02 18:14:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!