Bagian 4: Menemukan Permulaan JPEG di BLOB
Format tipe objek OLE - ambil tiga!
Sekarang yang perlu kita lakukan hanyalah menyimpan image ke disk (sebagai file biner biasa) dan memahami apa yang ada di dalamnya.
Semua file gambar (format) memiliki header file yang mengidentifikasi gambar secara unik. File gambar JPG dimulai dengan apa yang disebut tag SOI, yang nilai heksadesimalnya adalah $FFD8.
Baris kode berikut menyimpan nilai bidang gambar ke dalam file yang relevan (BlobImage.dat) di direktori kerja. Tempatkan kode ini di acara OnCreate formulir dan hapus kode tersebut setelah memulai proyek.
ADOTable1Picture.SaveToFile('BlobImage.dat');
Setelah kita memiliki file ini. Kita dapat menggunakan Hex editor untuk melihat isinya.
Apakah kamu percaya? Akses MS menyimpan jalur ke objek OLE yang terhubung di bidang objek OLE sebagai bagian dari definisi objek. Karena definisi penyimpanan objek OLE tidak didokumentasikan (!? Ini berasal langsung dari MS), tidak ada cara untuk mengetahui data gambar aktual apa yang akan diperoleh sebelum ditulis.
Pertimbangkan pertanyaan ini dalam dua bagian. Pertama: kita perlu mencari 'FFD8' dan mulai membaca gambar dari sana. Kedua: 'FFD8' tidak selalu bisa berada pada posisi yang sama di file. Kesimpulan: Kita memerlukan fungsi yang mengembalikan lokasi tag SOI dari file JPG yang disimpan sebagai objek OLE di database Access.
Cara yang benar - ambil empat!
Dengan bidang tipe Blob yang disediakan, fungsi kita harus mengembalikan posisi string 'FFD8' di ADOBlobStream. ReadBuffer membaca data dari aliran byte demi byte. Setiap panggilan ke ReadBuffer memindahkan posisi aliran byte demi byte. Fungsi ini mengembalikan posisi aliran ketika dua byte bersama-sama mengarah ke penanda SOI. Inilah fungsinya:
fungsi JpegStartsInBlob(PicField:TBlobField):integer;
var
bS : TADOBlobStream;
penyangga: Kata;
hx: tali;
mulai
Hasil := -1;
bS := TADOBlobStream.Create(PicField, bmRead);
mencoba
sedangkan (Hasil = -1) dan (bS.Posisi + 1 < bS.Ukuran) dilakukan
mulai
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(penyangga, 2);
jika hx = 'FF' maka mulai
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(penyangga, 2);
jika hx = 'D8' maka Hasil := bS.Posisi - 2
lain jika hx = 'FF' maka
bS.Posisi := bS.Posisi-1;
akhir; //jika
akhir; //sementara
Akhirnya
bS.Gratis
akhir; //coba
akhir;
Setelah kita mendapatkan lokasi penanda SOI, kita dapat menggunakannya untuk menemukan lokasi gambar di aliran ADOBlob.
menggunakan jpeg;
...
Prosedur TForm1.btnShowImageClick(Pengirim: TObject);
var
bS : TADOBlobStream;
foto: TJpegImage;
mulai
bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);
mencoba
bS.Seek(JpegStartsInBlob(AdoTable1Picture),soFromBeginning);
Gambar:=TJpegImage.Buat;
mencoba
Gambar.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Gambar;
Akhirnya
Gambar.Gratis;
akhir;
Akhirnya
bS.Gratis
akhir;
akhir;
Jalankan proyeknya, ya!
Sekarang siapa yang bisa mengatakan bahwa pemrograman itu tidak menyenangkan?
Catatan: Dalam program kode sebenarnya, kami akan menambahkan kode untuk membaca dan menampilkan gambar dari baris saat ini di acara AfterScroll TDataSet (ada di prosedur acara ADOTable1AfterScroll). Peristiwa AfterScroll terjadi ketika aplikasi berpindah dari satu rekaman ke rekaman lainnya.
Ide kelima!
Itulah inti bab ini. Sekarang Anda dapat menyimpan dan menampilkan semua gambar JPG yang Anda minati. Pada halaman terakhir artikel ini, saya akan memberikan kode lengkap (unit form1); semua susunan data ditempatkan di event OnCreate form. Ini memastikan bahwa ketiga komponen terhubung dengan benar - Anda tidak perlu menggunakan Object Inspector saat mendesain.
Saya akui, bab ini bukan untuk pemula, tapi dunia adalah tempat yang kejam! Hal lain: Anda menyadari bahwa pada akhirnya Anda bahkan tidak tahu cara mengubah (atau menambahkan beberapa gambar baru) ke tabel! Ya, itu cerita lain!