Save Load Image Database di Delphi #221
Apakah ini Krusty Crab? Bukaaaaan, ini PATRIIIICK
andrypein.net : Dengan advanced technique ini aing kasih tutorial bagaimana Save load image database di delphi.
Berawal dari percobaan ngesave image dengan extensi .jpg atau .bmp ke dalam database dan bisa dilakukan.
Nah tantangan selanjutnya bagaimana dengan semua tipe gambar yang common (.png .gif .jpg .bmp)?
Dengan modal ngaskus, ane open thread disana dan bertanya pada master-master delphi waktu itu dan akhirnya aing experimen sendiri ngoding dengan clue yang diberi tau oleh master disana.
Fixed juga ini aplikasi dan cara bagaimana load save image ke databes, simak gan!
Untuk bahan-bahannya ane memakai Zeos sebagai Koneksi ke DB (Contoh di post ini ane memakai db SQLite) lanjut dengan DBNavigator, DataSource, ZTable, ZConnection, 2 TButton,and 1 TImage.
Untuk perkodingan pertama-tama tambahkan konstanta ini terlebih dulu.
const MinGraphicSize = 44;
* Lalu tambahkan uses uses yang diperlukan untuk koding mulai dari :
uses JPEG,PNGIMage,GIFImage,consts;
* Ada 2 function untuk melakukannya, bebas mau pilih yang mana yg pasti it works, btw aing pake fungsi yang nomer 2.
//Fungsi Pertama
function FindGraphicClass(const Buffer; const BufferSize: Int64; out GraphicClass: TGraphicClass): Boolean; overload; var LongWords: array[Byte] of LongWord absolute Buffer; Words: array[Byte] of Word absolute Buffer; begin GraphicClass := nil; Result := False; if BufferSize < MinGraphicSize then Exit; case Words[0] of $4D42: GraphicClass := TBitmap; $D8FF: GraphicClass := TJPEGImage; $4949: if Words[1] = $002A then GraphicClass := TWicImage; //i.e., TIFF $4D4D: if Words[1] = $2A00 then GraphicClass := TWicImage; //i.e., TIFF else if Int64(Buffer) = $A1A0A0D474E5089 then GraphicClass := TPNGImage else if LongWords[0] = $9AC6CDD7 then GraphicClass := TMetafile else if (LongWords[0] = 1) and (LongWords[10] = $464D4520) then GraphicClass := TMetafile else if StrLComp(PAnsiChar(@Buffer), 'GIF', 3) = 0 then GraphicClass := TGIFImage else if Words[1] = 1 then GraphicClass := TIcon; end; Result := (GraphicClass <> nil); end;
//Fungsi Kedua
function FindGraphicClass(Stream: TStream; out GraphicClass: TGraphicClass): Boolean; overload; var Buffer: PByte; CurPos: Int64; BytesRead: Integer; begin if Stream is TCustomMemoryStream then begin Buffer := TCustomMemoryStream(Stream).Memory; CurPos := Stream.Position; Inc(Buffer, CurPos); Result := FindGraphicClass(Buffer^, Stream.Size - CurPos, GraphicClass); Exit; end; GetMem(Buffer, MinGraphicSize); try BytesRead := Stream.Read(Buffer^, MinGraphicSize); Stream.Seek(-BytesRead, soCurrent); Result := FindGraphicClass(Buffer^, BytesRead, GraphicClass); finally FreeMem(Buffer); end; end;
* Lalu masukan kode procedure untuk load Image dari DB nya.
procedure LoadPictureFromBlobField(Field: TBlobField; Dest: TPicture); var Graphic: TGraphic; GraphicClass: TGraphicClass; Stream: TMemoryStream; begin Graphic := nil; Stream := TMemoryStream.Create; try Field.SaveToStream(Stream); if Stream.Size = 0 then begin Dest.Assign(nil); Exit; end; if not FindGraphicClass(Stream.Memory^, Stream.Size, GraphicClass) then raise EInvalidGraphic.Create(SInvalidImage); Graphic := GraphicClass.Create; Stream.Position := 0; Graphic.LoadFromStream(Stream); Dest.Assign(Graphic); finally Stream.Free; Graphic.Free; end; end;
Cukup sampai disana aja sih sebenernya, improvisasi selanjutnya adalah tentang koneksi nya, program saya pake database sqlite dam sukses load save macam gambar tanpa error.
Ini penting yaitu jika memakai konektor lain, misal zeos, ado dll jngan lupa si table nya di add all field agar ketauan tar mana yang tipe nya BLOB, ini berlaku untuk semua jenis database yang akan dipakai.
type TForm1 = class(TForm) Image1: TImage; BitBtn1: TBitBtn; BitBtn2: TBitBtn; ZConnection1: TZConnection; //Koneksi memakai zeos ZTable1: TZTable; opd: TOpenPictureDialog; spd: TSavePictureDialog; DataSource1: TDataSource; ZTable1image: TBlobField; //Setelah di Add All Field DBNavigator1: TDBNavigator; procedure FormCreate(Sender: TObject); procedure ZConnection1AfterConnect(Sender: TObject); procedure DataSource1DataChange(Sender: TObject; Field: TField); procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
* Next lanjut, tambahkan komponen TImage nya, openpicturedialog, savepicturedialog dan 2 tombol
Sekarang kita ke pengaturan koneksi (khusus untuk database SQLite) yang lainnya tinggal menyesuaikan sesuai database yang dipakai dan komponen konektor yang diinstal di IDE, pertama kita ke form create.
procedure TForm1.FormCreate(Sender: TObject); begin ZConnection1.LibraryLocation:=extractfilepath(application.ExeName)+'sqlite3.dll'; spd.InitialDir:=getcurrentdir; //spd untuk save picture dialog ZConnection1.Database:=extractfilepath(application.ExeName)+'tes.db'; ZConnection1.Connect; end;
lalu ke connection after connect
procedure TForm1.ZConnection1AfterConnect(Sender: TObject); begin ZTable1.TableName:='poto'; ZTable1.Open; end;
lalu ke data source on Change
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); begin image1.Picture:=nil; LoadPictureFromBlobField(ZTAble1Image, image1.Picture) //sesuaikan dengan nama tabel yang setelah di add all field end;
Dan ini untuk tombol browse and save si gambar.
procedure TForm1.BitBtn2Click(Sender: TObject); begin opd.Execute(); //od untuk opendialog ZTable1.Append; ZTable1Image.LoadFromFile(opd.FileName); ZTable1.Post; end;
Terakhir untuk tombol save to file.
procedure TForm1.Button2Click(Sender: TObject); begin if spd.Execute then if FileExists(spd.FileName) then raise Exception.Create('file already exists') else image1.Picture.SaveToFile(spd.FileName); end;
Last event saat form close.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin unitable1.Close; uniconnection1.Disconnect; end;
Jika pusing, sudah disediakan kolom komentar ko untuk bertanya, atau revisi atau apa problem solving atau protes karena tutornya kurang lengkap, silahkan bebas.
Liat gan ini berhasil :
ijin liat2
silahkan gan, makasih kunjungannya 😀
bisa tidak di terapkan di aplikasi webbase dengan unigui
seharusnya bisa gan, cuma ane belum coba + ane ga main delphi lagi :p