這個是我專案中的源代碼:
// 保存圖片
procedure TfrmSetPrintFormat.SaveImage();
var
Stream:TMemoryStream;
begin
if imgTicket.Picture.Width = 0 then
// 無圖
Exit;
Stream := TMemoryStream.Create; // 創建記憶體流
case intPictureType of
1:
imgTicket.Picture.Graphic.SaveToStream(Stream); // 將圖片保存到記憶體流中
2:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 將圖片保存到記憶體流中
0:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 將圖片保存到記憶體流中
end;
imgTicket.Picture.Graphic.SaveToStream(Stream); // 將圖片保存到記憶體流中
qSet.Close;
qSet.Parameters.Clear;
qSet.SQL.Clear;
qSet.SQL.Add('UPDATE PrintScheme SET Photo=:photo,PhotoType=' +
IntToStr(intPictureType) + ' WHERE ID=' + IntToStr(intSchemeContentID));
qSet.Parameters.ParamByName('photo').LoadFromStream(Stream,ftBlob); // 讀取保存的記憶體圖
qSet.ExecSQL;
Stream.Free; // 釋放記憶體流
end;
// 加載圖片
procedure TfrmSetPrintFormat.LoadImage;
var
Stream:TMemoryStream;
Jpg:TjpegImage;
png:TPngImage;
begin
if not OpenSQL(qSet,'SELECT Photo,PhotoType FROM PrintScheme WHERE ID=' + IntToStr(intSchemeContentID)) then
Exit;
if qSet.Eof then
Exit;
if not qSet.FieldByName('Photo').IsNull then
begin
// 讀圖片型別
intPictureType := qSet.FieldByName('PhotoType').AsInteger;
// 加載圖片
Stream := TMemoryStream.Create ;
TBlobField(qSet.FieldByName('Photo')).SaveToStream(Stream); // 顯示的轉換為BlobField并保存到記憶體流
Stream.Position :=0;
case intPictureType of
1:
begin
Jpg := TjpegImage.Create ;
Jpg.LoadFromStream(Stream); // 加載圖片
imgTicket.Picture.Graphic.Assign(Jpg);
Jpg.Free;
end;
2:
begin
png := TPngImage.Create ;
png.LoadFromStream(Stream); // 加載圖片
imgTicket.Picture.Bitmap.Assign(Png);
png.Free;
end;
0:
imgTicket.Picture.Bitmap.LoadFromStream(Stream);
else
imgTicket.Picture := nil;
end;
Stream.Free;
end
else
begin
imgTicket.Picture := nil;
end;
end;
uj5u.com熱心網友回復:
請解釋一下OpenSQL的用法,我查不到這個函式,謝謝
uj5u.com熱心網友回復:
可能是他自己寫的函式~~~
uj5u.com熱心網友回復:
是我自己寫的函式:
// 打開SQL陳述句,成功回傳True
function TfrmMain.OpenSQL(query:TADOQuery;strSQL:string):Boolean;
begin
Result := True;
query.Close;
query.SQL.Clear;
query.SQL.Add(strSQL);
try
query.Open;
except
Result := False;
end;
end;
procedure TForm1.ShowPic;
var
vStr:TADOBlobStream;
vTmp,vTmp1,vPicType:string;
vtmpPath:PChar;
begin
Image1.Image.Graphic:=nil;//清空影像控制元件里的影像
vstr:=TADOBlobStream.Create(TBlobField(QueryDetail.FieldByName('Pic')),bmRead); //創建BlobStream,設定Pics欄位為Blob欄位,并設為只讀
if vstr.Size=0 then //Stream的大小為0說明沒有影像,退出
begin
exit;
end;
vPicType:=CheckImgType(vStr); //判斷影像型別
vstr.Position:=0; //指標移動到開頭
GetMem(vtmpPath,MAX_PATH); //獲取臨時目錄
GetTempPath(MAX_PATH,vtmpPath);//獲取臨時目錄
vTmp:=StrPas(vtmpPath); //獲取臨時目錄
FreeMem(vtmpPath);//釋放變數
vTmp:=vTmp + PubData1.GetGUIDString + '.' + vPicType; //將臨時目錄和檔案名合成全路徑檔案名
TBlobField(QueryDetail.FieldByName('Pic')).SaveToFile(vTmp); //從Blob欄位讀取影像資料保存到臨時檔案
while not FileExists(vTmp) do
begin
Sleep(100);
Application.ProcessMessages;
end;
Image1.Picture.LoadFromFile(vTmp); //影像控制元件讀取臨時檔案
DeleteFile(vTmp); //洗掉臨時檔案
end;
function TForm1.CheckImgType(Stream:TStream):String;
var
Buffer:Word;
i:integer;
begin
try
Stream.Position := 0; //移動指標到最開頭的位置
if Stream.Size = 0 then //如果檔案大小等于0,那么
begin
Result:='';
Exit;
end;
Stream.ReadBuffer(Buffer,2); //讀取檔案的前2個位元組,放到Buffer里面
if Buffer=$4D42 then //如果前兩個位元組是以4D42[低位到高位]
Result:='BMP' //那么這個是BMP格式的檔案
else if Buffer=$D8FF then //如果前兩個位元組是以D8FF[低位到高位]
Result:='JPEG' //........一樣 下面不注釋了
else if Buffer=$4947 then
Result:='GIF'
else if Buffer=$050A then
Result:='PCX'
else if Buffer=$5089 then
Result:='PNG'
else if Buffer=$4238 then
Result:='PSD'
else if Buffer=$A659 then
Result:='RAS'
else if Buffer=$DA01 then
Result:='SGI'
else if Buffer=$4949 then
Result:='TIFF'
else //如是其他型別的檔案的話,直接顯示錯誤
Result:='';
except
Result:='Err';
end;
procedure TForm1.ActionAddPicExecute(Sender: TObject);
begin
inherited;
if not QueryDetail.Active then
Exit;
with OpenPictureDialog1 do
begin
if not Execute then Exit;
Image1.Picture.Graphic:=nil;
Image1.Picture.LoadFromFile(FileName);//加載圖片
QueryDetail.Edit;
TBlobField(QueryDetail.FieldByName('Pic')).LoadFromFile(FileName);//重點這里,Image型別欄位加入檔案
QueryDetail.Post;
end;
end;
讀取檔案用了流,保存照片太簡單就直接檔案操作了。
uj5u.com熱心網友回復:
這是我N年前框架里的代碼,多個系統都在用,代碼可能沒有優化,反正可以用
uj5u.com熱心網友回復:
這個是我專案中的源代碼:
// 保存圖片
procedure TfrmSetPrintFormat.SaveImage();
var
Stream:TMemoryStream;
begin
if imgTicket.Picture.Width = 0 then
// 無圖
Exit;
Stream := TMemoryStream.Create; // 創建記憶體流
case intPictureType of
1:
imgTicket.Picture.Graphic.SaveToStream(Stream); // 將圖片保存到記憶體流中
2:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 將圖片保存到記憶體流中
0:
imgTicket.Picture.Bitmap.SaveToStream(Stream); // 將圖片保存到記憶體流中
end;
imgTicket.Picture.Graphic.SaveToStream(Stream); // 將圖片保存到記憶體流中
qSet.Close;
qSet.Parameters.Clear;
qSet.SQL.Clear;
qSet.SQL.Add('UPDATE PrintScheme SET Photo=:photo,PhotoType=' +
IntToStr(intPictureType) + ' WHERE ID=' + IntToStr(intSchemeContentID));
qSet.Parameters.ParamByName('photo').LoadFromStream(Stream,ftBlob); // 讀取保存的記憶體圖
qSet.ExecSQL;
Stream.Free; // 釋放記憶體流
end;
// 加載圖片
procedure TfrmSetPrintFormat.LoadImage;
var
Stream:TMemoryStream;
Jpg:TjpegImage;
png:TPngImage;
begin
if not OpenSQL(qSet,'SELECT Photo,PhotoType FROM PrintScheme WHERE ID=' + IntToStr(intSchemeContentID)) then
Exit;
if qSet.Eof then
Exit;
if not qSet.FieldByName('Photo').IsNull then
begin
// 讀圖片型別
intPictureType := qSet.FieldByName('PhotoType').AsInteger;
// 加載圖片
Stream := TMemoryStream.Create ;
TBlobField(qSet.FieldByName('Photo')).SaveToStream(Stream); // 顯示的轉換為BlobField并保存到記憶體流
Stream.Position :=0;
case intPictureType of
1:
begin
Jpg := TjpegImage.Create ;
Jpg.LoadFromStream(Stream); // 加載圖片
imgTicket.Picture.Graphic.Assign(Jpg);
Jpg.Free;
end;
2:
begin
png := TPngImage.Create ;
png.LoadFromStream(Stream); // 加載圖片
imgTicket.Picture.Bitmap.Assign(Png);
png.Free;
end;
0:
imgTicket.Picture.Bitmap.LoadFromStream(Stream);
else
imgTicket.Picture := nil;
end;
Stream.Free;
end
else
begin
imgTicket.Picture := nil;
end;
end;
眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......
值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......