ez3cshop
一般會員
發表:13 回覆:6 積分:3 註冊:2005-01-24
發送簡訊給我
|
請教大家:
我在網站找到一些使用TDBImage存取JPG格式圖檔的資料, 但它是針對Delphi比較多, 就是找不到相關C Builder 6的資料. 我現在使用SQL Server 2000, 想使用TDBImage元件來顯示JPG圖檔, 該如何實作呢? 或者是說, 使用TImage元件來做我也不反對, 因為我印象中, 曾在這裡看過高手使用TImage來顯示TDBImage格式的圖檔, 據說, 效能不錯. Thanks!
|
Stallion
版主
發表:52 回覆:1600 積分:1995 註冊:2004-09-15
發送簡訊給我
|
站裏資料很多,請多用搜尋!
> -------------------
學,然後知不足。
|
ez3cshop
一般會員
發表:13 回覆:6 積分:3 註冊:2005-01-24
發送簡訊給我
|
謝謝Stallion, 我參考了http://delphi.ktop.com.tw/topic.php?TOPIC_ID=70543這個主題,在存圖的部份大致OK. 但在讀圖的部份, 會有一些問題:
<textarea class="cpp" rows="10" cols="60" name="code">
void __fastcall TClientMainForm::Button2Click(TObject *Sender)
{
//讀圖
Query1->Open();
TMemoryStream *Stream = new TMemoryStream();
TJPEGImage *jpgstream = new TJPEGImage();
Stream = (TMemoryStream *)ClientMainForm->ZQAttachment->CreateBlobStream(Query1->FieldByName("PCT"), bmRead);
Stream->Position = 0;
jpgstream->LoadFromStream(Stream);
ClientMainForm->Image1->Picture->Assign(jpgstream); //PCT欄位是空值, 會當在這裡 Stream->Free();
jpgstream->Free();
}
</textarea><br />
1. 若JPG的圖檔太大, 如2MB, 則會只會讀出一點, 剩下的地方就黑黑的. 檔案小的JPG圖檔則沒有問題.
2. 若資料庫那一筆的圖檔並沒有資料, 則讀圖的時候會出錯. 請問大家, 我要如何判段這筆記錄的圖檔是沒有資料的?
3.萬一某筆記錄的圖檔之格式不是JPG, 也會發生錯誤. 那要如何去避開這個問題呢?
謝謝大家.
編輯記錄
yckuo 重新編輯於 2007-04-27 09:59:42, 註解 套用程式碼編輯‧
|
jean2004
初階會員
發表:69 回覆:80 積分:39 註冊:2004-12-18
發送簡訊給我
|
大蝦,印象裏的DBImage控制項是可以顯示jpeg圖像的,但是要加上這個:#include <jpeg.hpp> 另外,我有一個完整的例子代碼,符合大蝦的要求,這個可以上傳和下載各種檔,同時也支持JPEG和BMP等格式的檔,源碼如下,請參考:
<textarea class="cpp" rows="10" cols="60" name="code">
#include
#include
#include
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString iCString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" ExtractFilePath(ExpandFileName(Application->ExeName)) "pic.mdb;Persist Security Info=False";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{//添加圖片按鈕
if(OpenPictureDialog1->Execute())
{
String strSql = "INSERT INTO photo (name,pic)";
strSql = strSql " VALUES('無名氏',:picture)";
try{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(strSql);
ADOQuery1->Parameters->ParamByName("picture")->LoadFromFile(OpenPictureDialog1->FileName, ftBlob);
ADOQuery1->ExecSQL();
} catch(...) { return; } ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from photo");
ADOQuery1->Open();
DBGrid1->Refresh();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{//修改圖片按鈕
if(OpenPictureDialog1->Execute())
{
AnsiString name=ADOQuery1->FieldByName("ID")->Value ;
String strSql = "UPDATE photo SET PIC=";
strSql = strSql " :picture where ID=";
strSql = strSql name;
try{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(strSql);
ADOQuery1->Parameters->ParamByName("picture")->LoadFromFile(OpenPictureDialog1->FileName, ftBlob);
ADOQuery1->ExecSQL();
} catch(...) { return; } ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from photo");
ADOQuery1->Open();
//DBGrid1->Refresh();
}
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)
{//執行查詢
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->ConnectionString=iCString;
ADOQuery1->SQL->Add("select * from photo");
ADOQuery1->Open();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::DataSource1DataChange(TObject *Sender,
TField *Field)
{//下載圖片
if(ADOQuery1->RecordCount>0)
{
TStream *Stream1;
Stream1=ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("pic"), bmRead);
try{
char *TemplatePtr;
TemplatePtr=new char[Stream1->Size];
try{
Stream1->Read(TemplatePtr,Stream1->Size);
if(Stream1->Size>2)
{
FILE *fp;
AnsiString Fname="AA." AnsiString(*TemplatePtr=='B'?"BMP":"JPG");//區別BMP和JPG格式
Caption=Fname;
fp=fopen(Fname.c_str(),"wb");
fwrite(TemplatePtr,Stream1->Size,1,fp);
fclose(fp);
Caption=Fname;
if (Fname=="AA.JPG")
{
TJPEGImage *jp = new TJPEGImage();
jp->LoadFromFile(Fname) ;
Image2->Picture->Assign(jp) ;
Image2->Tag=1;
}
else
{
Graphics::TBitmap *BrushBmp = new Graphics::TBitmap;
BrushBmp->LoadFromFile(Fname) ;
Image2->Picture->Assign(BrushBmp) ;
Image2->Tag=1;
}
}
else
{//無圖片處理
Image2->Tag=0;
Image2->Picture->Assign(NULL);
}
}
catch(...)
{
delete TemplatePtr;
throw;
}
delete TemplatePtr;
}
catch(...){
delete Stream1;
throw;
}
delete Stream1;
}
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender)
{//批量入庫按鈕
ListBox1->Clear();//清空ListBox控制項
if(OpenPictureDialog1->Execute())
{
AnsiString PathName=ExtractFilePath(OpenPictureDialog1->FileName);
TSearchRec sr;
if(FindFirst(PathName "*.*", faAnyFile, sr) == 0)
{
do
{
if(!(sr.Attr & faDirectory))
{
if(ExtractFileExt(sr.Name).UpperCase()==".BMP" || ExtractFileExt(sr.Name).UpperCase()==".JPG" || ExtractFileExt(sr.Name).UpperCase()==".JPEG")
ListBox1->Items->Add(sr.Name);
}
}
while(FindNext(sr) == 0);
FindClose(sr);
}
}
if(ListBox1->Count>0)
{
for(int i=0;i<=ListBox1->Count-1;i )
{
ListBox1->ItemIndex = i;
String strSql = "INSERT INTO photo (name,pic)";
strSql = strSql " VALUES('無名氏',:picture)";
try{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(strSql);
ADOQuery1->Parameters->ParamByName("picture")->LoadFromFile(ExtractFilePath(OpenPictureDialog1->FileName) ListBox1->Items->Strings[i], ftBlob);
ADOQuery1->ExecSQL();
} catch(...) { return; }
}
}
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("SELECT * FROM photo");
ADOQuery1->Open();
DBGrid1->Refresh();
}
</textarea>
編輯記錄
yckuo 重新編輯於 2007-04-27 09:54:31, 註解 套用程式碼編輯‧
|
KENI_LIN
中階會員
發表:86 回覆:267 積分:90 註冊:2004-05-31
發送簡訊給我
|
引言:
或者是說, 使用TImage元件來做我也不反對, 因為我印象中, 曾在這裡看過高手使用TImage來顯示TDBImage格式的圖檔, 據說, 效能不錯. Thanks!
TImage 元件的範例程式: (1)JPG與BMP格式轉換,看是要開JPG或存JPG都可以!
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=68151 (2)如何開啟JPG檔.
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=70359 (3)載入JPG~存入JPG.
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=70569 寒窗苦讀十年書;只待今朝狀元時!~~
︵ / / ︵
( ∩ ∩ )
○ ︶ ○
Keni Lin
------ Keni Lin
|