STEGANOGRAPHY: Secret Data In A Picture

Steg_main14208
Steganography adalah suatu teknik memasukkan data ke data lain. Yang akan saya bahas berikut adalah teknik Steganography dengan menyembunyikan data string ke dalam gambar Bitmap (BMP) dengan memasukkan tiap bit dari tiap karakter data ke data warna tiap pixel Bitmap. Meskipun demikian, Steganography dapat pula diaplikasikan pada media tipe data lainnya, seperti WAV, MP3, bahkan Corinna John telah mempublikasikan teknik Steganography dengan media tape (pita) kaset.

Kembali ke data string dan Bitmap, kita anggap bila kita mempunyai data string “Rahasia” dan sebuah Bitmap berukuran 100px(w) x 100px (h). Kita mulai dari karakter pertama dari string “Rahasia”
“R” -> 01010010
di mana 01010010 adalah kode biner untuk 82 – yang merupakan kode ASCII karakter “R”.
Selanjutnya, tiap bit ini akan kita tambahkan di tiap pixel warna Bitmap yang tersedia, sehingga untuk kedelapan bit biner ini kita memerlukan delapan pixel warna Bitmap. Misalkan urutan delapan pixel warna pertama adalah:
FF8045FE
FF4532ED
FF239933
FF3788A1
FF542322
FF30FF32
FF903008
FFFF8998

Dengan mengingat bahwa tiap pixel warna terdiri dari 4 byte, di mana byte pertama adalah kode palette, 3 byte berikutnya masing-masing adalah warna-warna Red, Green dan Blue (RGB). Tiap bit dari 01010010 , dimulai dari LSB – atau bit paling kanan, akan kita masukkan ke tiap pixel warna di atas – mulai pixel paling awal – pada bit terakhirnya, sebagai berikut:

Bit “0” di-AND dengan bit terakhir pixel warna
Bit “1” di-OR dengan bit terakhir pixel warna
FF8045[FE] and 0 = FF8045FE
FF4532[ED] or 1 = FF4532ED
FF2399[33] and 0 = FF239932
FF3788[A1] and 0 = FF3788A0
FF5423[22] or 1 = FF542323
FF30FF[32] and 0 = FF30FF32
FF9030[08] or 1 = FF903009
FFFF89[98] and 0 = FFFF8998

Ingat, hanya bit terakhir dari byte terakhir yang pixel warna yang dipakai dalam operasi ini. Setelah selesai operasi pada kedelapan bit biner dari kode ASCII 82 (“R”), tiap pixel warna ini dikembalikan ke bitmap asalnya. Selanjutnya, proses operasi di atas dapat diterapkan pada karakter selanjutnya – dari data kita, yaitu “a” – terhadap 8 pixel warna berikutnya dari Bitmap yang tersedia. Untuk lebih jelas, berikut implementasinya dalam Delphi:

{
input:
Data: Data Rahasia
Bitmap:bitmap sumber yang akan dimanipulasi
SaveTo: bitmap baru yang akan menampung hasil manipulasi

Saya sengaja memisahkan bitmap hasil manipulasi agar mudah dalam operasi selanjutnya
}
procedure EmbedToBmp(const Data:String; Bitmap, SaveTo:TBitmap);
var
  bs:AnsiString;
  pix:TColor;
  i,j:integer;
  count:Word;
  bmp:TBitmap;
begin
  //Tiap karakter Data diubah ke digit-digit biner yang mewakili kode ASCII-nya.
  bs:=BytesToBits(data);
  SaveTo.Assign(bitmap);

  SaveTo.Canvas.Lock;
  count:=1;
  for i:= 0 to SaveTo.Height-1 do
  begin
    if count>MAX_BITS_COUNT then
         break;
    for j:= 0 to SaveTo.Width-1  do
    begin
       pix:=SaveTo.Canvas.Pixels[j,i];
       //Ambil tiap pixel untuk tiap bit Data
       if count>MAX_BITS_COUNT then
         break;

       if bs[count] = '1' then
         pix:=pix or $00000001 //operasi OR untuk Bit "1"
       else
         pix:=pix and $FFFFFFFE; //operasi AND untuk Bit "0"
       inc(count);
       //kembalikan hasil operasi ke Bitmap
       SaveTo.Canvas.Pixels[j,i]:=pix;
    end;
  end;
  SaveTo.Canvas.Unlock;
end;

Dalam kode di atas, kita perlu mengkonversi tiap byte/karakter Data Rahasia kita menjadi kode binernya. Kita buat lagi sebuah fungsi untuk menjalankan tugas ini:

{
input:
Data: Data String yang tersusun dari karakter-karakter.
}
function BytesToBits(const data:String):AnsiString;
var
  bit,b:Byte;
  i,j:integer;
  tmp:String;
  count:Integer;
  ans:AnsiString;

begin
  if Data = '' then
  begin
    ShowMessage('Data masih kosong.');
    exit;
  end;
  tmp:= MARK_STRING + Data;
  //MARK_STRING diperlukan untuk validasi data nantinya
  SetLength(ans, MAX_BITS_COUNT);
  for i:= 1 to MAX_BITS_COUNT do
      ans[i]:='0';
  count:=0;
  for i:=1 to length(tmp) do
  begin
    b:=ord(tmp[i]);
    for j:=0 to 7 do
    begin
      bit:= (b shr j) and 1;
      //Shift Right untuk menempatkan
      //tiap bit pada posisi paling kanan (LSB)
      ans[count+1]:=IntToStr(bit)[1];
      inc(count);
    end;
  end;
  Result:=Ans;
end;

Sekarang semua sudah selesai. Hasil operasi ini pada Bitmap tidak akan tertangkap oleh mata, sehingga Bitmap hasil manipulasi akan tetap terlihat sama dengan Bitmap aslinya. Pertanyaan muncul, bagaimana membaca kembali data yang tersimpan dalam Bitmap tersebut? Berikut fungsi untuk membaca satu bit data dari tiap pixel warna Bitmap:

{
input
Bitmap: bitmap yang akan dibaca datanya
Internal: menentukan apakah funsi ini akan dipakai untuk membaca data,
ataukah hanya mengetes apakah Bitmap mengandung data yang diperlukan
ingat kembali MARK_STRING pada fungsi BytesToBits() di atas
}
function ReadFromBMP(const Bitmap:TBitmap; const internal:Boolean=False):String;
var
  bs:AnsiString;
  pix:Byte;
  i,j:integer;
  count:Word;
  mark:String;
begin
  SetLength(bs, MAX_BITS_COUNT);
  bitmap.Canvas.Lock;
  count:=1;
  for i:= 0 to bitmap.Height-1 do
  begin
    if count>MAX_BITS_COUNT then
         break;
    for j:= 0 to bitmap.Width-1 do
    begin
       if count>MAX_BITS_COUNT then
         break;
       pix:=Bitmap.Canvas.Pixels[j,i];
       pix:=pix and $00000001;
       bs[count]:=IntToStr(pix)[1];
       inc(count);
    end;
  end;
  bitmap.Canvas.Unlock;
  //Ubah deretan bit yang didapat ke karakter-karakter yang sesuai
  Result:=BitsToBytes(bs);
  //pembacaan data atau cuma pengecekan?
  if Internal then
    exit; //internal use. jangan cek lagi valid atau tidak

  //cek validitas data dengan memeriksa MARK_STRING
  mark:=copy(Result, 1, length(MARK_STRING));
  if mark = MARK_STRING then
    Delete(Result, 1, length(MARK_STRING))
  else
  begin
    //DATA tidak valid
    //MessageBox(handle, 'Invalid BITMAP or BITMAP doesn''t contain secret data.','Warning',MB_ICONWARNING);
    Result:='Warning.'+#13#10+'Invalid BITMAP or BITMAP doesn''t contain secret data.';
  end
end;

Pada fungsi di atas, kita memerlukan fungsi konversi deretan bit ke karakter-karakter yang sesuai:

{
input:
Bits:Deretan bit yang akan dikonversi
}
function BitsToBytes(const bits: AnsiString): String;
var
  tmp:String;
  j:integer;
  bit, b:byte;
  str8:String;
begin
  tmp:=Bits;
  Result:='';
  while Length(tmp)>0 do
  begin
    Ambil tiap depalan bit
    str8:=copy(tmp,1,8);
    Delete(tmp, 1,8);
    //Posisi/urutan bit harus dibalik
    str8:=ReverseBits(str8);
    b:=0;
    for j:=1 to 8 do
    begin
      if str8[j] = '1' then
        bit:= 1
      else
        bit:= 0;
      b:=(b shl 1) or bit;
    end;
    Result:=Result+chr(b);
  end;
end;

Dengan mengingat fungsi EmbedToBmp() mengambil bit-bit data biner dari kanan (LSB), sedangkan proses konversi BitsToBytes() memproses data dari kiri (MSB), maka posisi/urutan bit data biner harus dibalik. Kita gunakan fungsi berikut:

{
input: deretan 8 bit
}
function ReverseBits(const bits: String): String;
var
  i:integer;
begin
  if length(bits)<>8 then
    exit;
  Result:=Bits;
  for i := 1 to 8 do
    Result[8-(i-1)]:=Bits[i];
end;

KODE LENGKAP
Setelah memahami langkah-langkah di atas, sekarang kita lihat kode selengkapnya.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ExtDlgs;

Const
MARK_STRING_LENGTH = 5;
MARK_STRING = ‘harum’;
{
You may change either MARK_STRING or MARK_STRING_LENGTH within
corresponding changes
}

MAX_CHAR_COUNT = 100;
// maximum size (in chars/bytes) of secret data

MAX_BITS_COUNT = (MAX_CHAR_COUNT+MARK_STRING_LENGTH)*8;
{
100 = Max chars of secret text
5 = additional fo mark string
8 = bits count for each char
You may change length of data (MAX_CHAR_COUNT) to fit your needs,
means MAX_BITS_COUNT will automatically change,
again, means you must keep BITMAP dimension supplied by user
to be bigger than MAX_BITS_COUNT

at example above, MAX_BITS_COUNT will be (100+5) * 8,
which is 840, then BITMAP supplied for operation must
be at least 84pixels x 10pixels. But to avoid any unwanted illegal operation,
performing a 100 x 100 pixels BITMAP will be better idea.

Matter about MARK_STRING = ‘harum’???
She’s somebody special,
spirit of My Blog (https://jokorb.wordpress.com)!!!
}

{
This unit of code is copyrighted by jokorb@yahoo.co.uk
and is porperty of https://jokorb.wordpress.com

You may use it without any warranty, either all or part(s).
Please report any changes back to me (my email) or via
https://jokorb.wordpress.com/post/

}
type

Bits = array [1..MAX_BITS_COUNT] of byte;
TForm1 = class(TForm)
Image1: TImage;
Bevel1: TBevel;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Button3: TButton;
Button4: TButton;
spd: TSavePictureDialog;
opd: TOpenPictureDialog;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function ReverseBits(const bits:String):String;
function BytesToBits(const data:String):AnsiString;
function BitsToBytes(const bits:AnsiString):String;
procedure EmbedToBmp(const Data:String; Bitmap, SaveTo:TBitmap);
function ReadFromBMP(const Bitmap:TBitmap; const internal:Boolean=False):String;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.BytesToBits(const data:String):AnsiString;
var
bit,b:Byte;
i,j:integer;
tmp:String;
count:Integer;
ans:AnsiString;

begin
if Data = ” then
begin
ShowMessage(‘Data masih kosong.’);
exit;
end;
tmp:= MARK_STRING + Data;
SetLength(ans, MAX_BITS_COUNT);
for i:= 1 to MAX_BITS_COUNT do
ans[i]:=’0′;
count:=0;
for i:=1 to length(tmp) do
begin
b:=ord(tmp[i]);
for j:=0 to 7 do
begin
bit:= (b shr j) and 1;
ans[count+1]:=IntToStr(bit)[1];
inc(count);
end;
end;
Result:=Ans;
end;

procedure TForm1.EmbedToBmp(const Data:String; Bitmap, SaveTo:TBitmap);
var
bs:AnsiString;
pix:TColor;
i,j:integer;
count:Word;
bmp:TBitmap;
begin
bs:=BytesToBits(data);
SaveTo.Assign(bitmap);

SaveTo.Canvas.Lock;
count:=1;
for i:= 0 to SaveTo.Height-1 do
begin
if count>MAX_BITS_COUNT then
break;
for j:= 0 to SaveTo.Width-1 do
begin
pix:=SaveTo.Canvas.Pixels[j,i];
if count>MAX_BITS_COUNT then
break;

if bs[count] = ‘1’ then
pix:=pix or $00000001
else
pix:=pix and $FFFFFFFE;
inc(count);
SaveTo.Canvas.Pixels[j,i]:=pix;
end;
end;
SaveTo.Canvas.Unlock;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
fn:String;
bmp:TBitmap;
begin
//cek dulu dengan pemanggilan internal
if MARK_STRING = copy(ReadFromBMP(Image1.Picture.Bitmap,true),1,length(MARK_STRING)) then
begin
//sudah menyimpan data, tampil pesan.
MessageBox(handle, ‘This BITMAP already contains secret data!.’,’Error’,MB_ICONHAND);
exit;
end;
if spd.Execute then
fn:=spd.FileName
else
fn:=’c:\SecretPicture.bmp’;
bmp:=TBitmap.Create;
EmbedToBMP(memo1.text, image1.Picture.Bitmap,Bmp);
bmp.SaveToFile(fn);
bmp.Free;
end;

function TForm1.ReadFromBMP(const Bitmap:TBitmap; const internal:Boolean=False):String;
var
bs:AnsiString;
pix:Byte;
i,j:integer;
count:Word;
mark:String;
begin
SetLength(bs, MAX_BITS_COUNT);
bitmap.Canvas.Lock;
count:=1;
for i:= 0 to bitmap.Height-1 do
begin
if count>MAX_BITS_COUNT then
break;
for j:= 0 to bitmap.Width-1 do
begin
if count>MAX_BITS_COUNT then
break;
pix:=Bitmap.Canvas.Pixels[j,i];
pix:=pix and $00000001;
bs[count]:=IntToStr(pix)[1];
inc(count);
end;
end;
bitmap.Canvas.Unlock;
Result:=BitsToBytes(bs);
if InterNal then
exit; //internal use. jangan cek lagi valid atau tidak
mark:=copy(Result, 1, length(MARK_STRING));
if mark = MARK_STRING then
Delete(Result, 1, length(MARK_STRING))
else
begin
//MessageBox(handle, ‘Invalid BITMAP or BITMAP doesn”t contain secret data.’,’Warning’,MB_ICONWARNING);
Result:=’Warning.’+#13#10+’Invalid BITMAP or BITMAP doesn”t contain secret data.’;
end
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Memo1.Text:=ReadFromBmp(Image1.Picture.Bitmap);
//ReadFromBmp(Image1.Picture.Bitmap);
end;

function TForm1.BitsToBytes(const bits: AnsiString): String;
var
tmp:String;
j:integer;
bit, b:byte;
str8:String;
begin
tmp:=Bits;
Result:=”;
while Length(tmp)>0 do
begin
str8:=copy(tmp,1,8);
Delete(tmp, 1,8);
str8:=ReverseBits(str8);
b:=0;
for j:=1 to 8 do
begin
if str8[j] = ‘1’ then
bit:= 1
else
bit:= 0;
b:=(b shl 1) or bit;
end;
Result:=Result+chr(b);
end;
end;

function TForm1.ReverseBits(const bits: String): String;
var
i:integer;
begin
if length(bits)<>8 then
exit;
Result:=Bits;
for i := 1 to 8 do
Result[8-(i-1)]:=Bits[i];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ok:Boolean;
begin
OK:=False;
if opd.Execute then
begin
With TBitmap.Create do
begin
try
LoadFromFile(opd.FileName);
if (width*height)<=MAX_BITS_COUNT then begin MessageBox(handle,'Gambar harus Bitmap berdimensi minimal 100*100 pixel.','Error',MB_ICONHAND); exit; end; ok:=True; except Free; end; end; end; if OK then Image1.Picture.LoadFromFile(opd.FileName); end; end. [/sourcecode] Mohon maaf, komentarnya dalam Bahasa Inggris, karena kode ini ditujukan untuk dipakai di FolderCustomizer. DOWNLOAD
Silahkan download aplikasi terapan dari kode di atas:
Steganography Source + EXE (ganti ekstensi ke .ZIP setelah download).

REFERENSI
Berikut sebuah link yang mungkin bisa jadi referensi, hanya saja, ditulis dalam C/C++
http://www.codeproject.com/KB/security/HideIt.aspx

google_tags: delphi, steganography, jokorb, Secret Data, Bitmap, corinna john, reversebits, BytesToBits, BitsToBytes

29 thoughts on “STEGANOGRAPHY: Secret Data In A Picture

  1. Mau tanya om.
    Apakah bisa hidden file ke AVI ?
    kan setidaknya AVI juga dari BMP.
    Apakah rumusnya juga sama dengan menggunakan BMP.
    Mohon pencerahannya🙂

  2. Om, tanya nih??
    ada ga source code dalam metode lain selain LSB? seperti metode
    Patchwork, Metoda Cox, Randomly Sequenced Pulse Position Modulated Code (RSPPMC).
    Mohon petunjuknya!!

  3. Aku llagi bikin tugas akhir ttg steganografi tp nggak hanya nyimpan teks tp juga file lain. tp mslhnya sampai saat ini hanya bisa nyimpan *.txt dan *.html. Gmn caranya biar bs nyimpan file lain seperti bitmap? trus aplikasi yang aku buat proses penyisipannya lama bgt.. mohon bantuannya. trims

  4. Lambatnya cuma pada proses datanya saja. Trus implementasi pada semua file sama. Dan yah, saya akan memposting contoh implementasi yang relevan dangan T.A. Anda.

  5. om.. boleh minta bantuan??
    gimana caranya dapetin data biner dari file jpg ya?? saya butuh untuk dienkripsi dengan metoda GOST. Soalnya operasi yang dilakukan oleh metoda GOST memerlukan data biner. Makasihh banyak,,, mohon dibalas ya…

  6. Sorry terlambat ya….🙂

    Contoh di sini telah menggunakan data biner kok. Hanyasanya yang diambil data binernya adalah data yang akan dienkripsi, bukan “host” atau target penyimpanannya.

    Sebagai catatan, Anda akan repot mendapatkan nilai biner tiap piksel JPG, karena di Delphi, TJPEGImage tidak memiliki Canvas. Library JPEG lain mungkin akan sangat Anda butuhkan. Silahkan googling, saya ga punya referensi…

    Jika yang Anda maksud adalah data biner yang secara raw diambil dari sebuah file JPEG, Anda bisa menggunakan fungsi FileOpen, FileRead. Data hasil pembacan bisa Anda konversi ke deretan bit-bit biner dengan fungsi BytesToBits() dalam psiting di atas.

    Salam, JokoRB

  7. mohon bimbingannya!
    saya skrg sedang mengerjakan tugas tentang steganografi dengan delphi. namun banyak sekali yang belum saya pahami, maklum saja saya baru pemula. mohon bantuannya tentang steganografi pada file bmp dengan metode selain LSB. klo ada sekalian sourcenya.
    makasih buaaannnnget……..!!

  8. mazz tolong bantuannya…

    saya lagi buat tgs akhir tentang implentasi teknik Steganography LSB dengan menyembunyikan data string ke dalam gambar JPEG..
    terima kasih ya mazz..
    (aya_cool42@yahoo.com)

  9. Untuk Uchagie, saya hanya mampu menerapkan manipulasi tiap pixel bitmap, untuk metode RGB. Untuk LSB? Saya malah tidak tahu apa itu LSB😦 . Mungkin maksud Anda HSB? Jika ya, Anda tinggal membuat rutin konversi RGB ke HSB (Hue, Saturation, Brightness). Untuk selain HSB, saya minta maaf, sejauh ini saya belum bisa.

    Untuk Adi Wibowo, Mas Adi, Tanaya telah menanyakan saya teknik yang mirip, pada komentarnya di atas. Dan saya minta maaf, untuk JPEG Anda mungkin butuh library yang memungkinkan akses tiap pixel untuk JPEG. Karena di Delphi, JPEG tidak mempunya kanvas.

  10. Salam kenal mas, saya tertarik dengan steganografi dan ingin membuat skripsi tentang itu. Saya ingin menggunakan metode LSB seperti yang ditulis “Uchagie”. Metode LSB itu metode Least Significat Bit mas. Kalo saya baca postingan anda diatas teknik yang mas sampaikan meyerupai teknik LSB, yaitu mengganti bit terakhir dengan bit dari pesan yang akan disisipkan. Saya boleh ambil sourcecode-nya khan buat referensi. trims sebelumnya.

    • Steganography dengan manipulasi LSB komponen warna sudah saya bahas di atas. Jika Anda tertarik dengan teknik stego di atas, silahkan download saja source-nya. Untuk selain itu saya belum kuasai, dan lagi sibuk ngurusin fotografi, jadi agak alon-alon pada Delphi belakangan ini.

      Salam kenal balik ya….🙂

  11. salam Kenal masa, saya tertarik dengan artikel anda saya juga pernah bikin program seperti yang anda buat dan saya bisa menampilkan images tersebut kedalam grafik histogram cuma saya bingung gimana caranya membuat simulasi bit 0 dan 1 tersebut agar orang lain tahu dan lihat …oh ini lho bit yang di ganti dan ini lho bit yg di buang, tapi semua itu dalam bentuk simulasi mohon pencerahannya. terima kasih….

  12. Maksudnya begini mas..

    sebuah gambar atau image itu kan gabungan dari bit-bit 0 dan 1 yang jumlahnya sangat banyak maksud saya gimana caranya buat simulasi agar bit 0 dan 1 tersebut bisa kita simulasikan menjadi bentuk histogram. ( proses menjadi histogram bukan langsung jadi histogram) kalau dari gambar tersebut langsung di jadikan histogram saya sudah bisa tapi gmn caranya menampilkan lewat animasi bit 0 dan 1 tsb manjadi histogram.

    Kemudian hubungannya dengan steganografi setelah gambar tersebut disisipi pesan gimana bentuk histogramnnya, atau dimana letak perbedaan antara gambar sebelum dimasukin pesan dengan gambar setelah dimasukin pesan..

    Terima kasih kalau blm jelas bisa di pertanyakan lagi

  13. Mas saya sekarang sedang menyusun tugas akhir judulnya perpaduan steganografi teknik End of File dan Kriptografi teknik RSH.Tapi saya masih kesulitan untuk kode program End of File.Bisakah tolong mas jelaskan,jika memungkinkan tolong kode program nya di share ya mas….

    • Teknik EOF hanya cocok untuk file teks, di mana file tersebut dengan standar OS. EOF, pada Windows adalah CTRL+Z (atau karakter ASCII 26). Dalam file teks (OS Created) hanya ada satu, nah, data setelah EOF ini adalah informasi yang tersembunyi.
      Pada file biner, karakter EOF dapat muncul berulangkali, dan tentunya tak dapat dipakai sebagai mark/pembatas antara isi file dan data rahasia kita.

      Teknik EOF ini harus dimodifikasi, sehingga cocok juga untuk file biner. Contohnya adalah SFX (Self Extractor) Executable: file instalasi, WinRAR SFX, WinZIP SFX, dsb. Tapi, metode yang dimodifikasi ini hanya cocok untuk steganografi pada file biner, misalnya DOC, JPG, dsb. Untuk file TXT (text), metode ini tidak cocok, karena data di akhir file TXT masih dapat dilihat, dengan menggunakan Notepad misalnya.
      Initi dari steganografi, data tersembunyi, bukan terenskripsi. Jadi meskipun terenkripsi, tapi tetap dapat dilihat (kasus pada file text), data belum dikatakan tersteganografi.
      Demikian pendapat saya atas komentar Anda.
      Bila setuju dengan gambaran di atas, kemungkinan saya akan membuat sebuah posting khusus tentang teknik EOF ini🙂

  14. salam kenal mas… maaf mau tanya lagi untuk meperjelas masalah seganografi jpg dengan menggunakan delphi. kata mas diatas kita harus mencari library jpg nya, nah pada bagian library itu saya tidak mengerti maksudnya, na library lpg itu seperti apa sih? jika kita mau gogling untuk library jpg apa keyword yang hrs kita masukan. makasih banyak ya mas.

  15. Untuk google, keywordnya: delphi jpeg library

    Secara default, Delphi tidak mendukung canvas untuk JPEG Image. Sehingga tidak memungkinkan membaca data gambar per pixel. Kita butuh library tambahan (3rd party) untuk memungkinkan baca-tulis data gambar per pixel. Untuk tipe Bitmap, Delphi sudah mendukungnya…

    • maksih banyak mas. saya coba pelajari lagi. kalo ada kesulitan saya tanya lagi. makasih mas. moga sukses slalu

  16. Salam buat mas joko semoga sehat selalu.
    mas saya masih kesulitan dengan steganografi untuk jpg memakai delphi. kata mas agar jpg bisa dibaca per pixelnya harus mencari library atau 3rd party buat pembacaan jpg itu di delphi. dan saya belum meneukannya sampe sekarang. mohon pencerahannya mas. saya belum lulus sampe sekarang dan saya sangat berharap bisa menyelesaikan penulisn ini. makasih bayak mas.

  17. gan kenapa gak bisa yaa di run aplikasinya pake xe7?
    katanya Incompatible types: ‘AnsiChar’ and ‘Char’
    kenapa ya??

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s