Arsip: tolong aku (biner to image - image to biner)

 
user image
more 13 years ago

sketsa

halo teman teman..... saya sedang coba bikin program kompresi image menggunakan metode run length di delphi... saya awam banget delphi..... cerita nya begini.... untuk kompresi imgae menggunakan metode run length (yang saya tahu), yaitu : 1. rubah citra menjadi biner 2. manipulasi (kompres) biner tersebut dengan menggunakan metode run length 3. rubah biner menjadi citra sederhana kan... (tapi bagi saya agak susah.... hehe..) saya dah dapet listing program sebagai berikut.. (ni juga dapet dari delphi-id.org) : procedure BitmapToStrs2(Bitmap: TBitmap; Strs: TStrings); type TRGBArray = ARRAY OF TRGBTriple; // pf24bit pRGBArray = ^TRGBArray; var ScanlinePtr : PByte; ScanlineIncrement : integer; LastScanline : PByte; x : integer; Line: pRGBArray; n, xx : integer; r, g, b : string; s : string; begin Assert(Bitmap.PixelFormat = pf24bit); // ! must be pf24bit x := Bitmap.Width; s := StringOfChar(#32, (x 24)+(x -1)); Strs.Clear; ScanlinePtr := Bitmap.Scanline[0]; ScanlineIncrement := integer(Bitmap.Scanline[1]) - integer(ScanlinePtr); LastScanline := ScanlinePtr; Inc(LastScanLine, ScanlineIncrement Bitmap.Height); repeat Line := pRGBArray(ScanLinePtr); xx := 1; for n := 0 to x -1 do begin r := ByteToStr(Line[n].rgbtRed); g := ByteToStr(Line[n].rgbtGreen); b := ByteToStr(Line[n].rgbtBlue); MoveMemory(@s[xx], @r[1], 8); MoveMemory(@s[xx +8], @g[1], 8); MoveMemory(@s[xx +16], @b[1], 8); Inc(xx, 25); end; Strs.Add(s); Inc(ScanlinePtr, ScanlineIncrement); // move to the next scanline until (ScanlinePtr = LastScanline); end; procedure StrsToBitmap2(Bitmap: TBitmap; Strs: TStrings); type TRGBArray = ARRAY OF TRGBTriple; // pf24bit pRGBArray = ^TRGBArray; var ScanlinePtr : PByte; ScanlineIncrement : integer; LastScanline : PByte; x : integer; Line: pRGBArray; i, n, xx : integer; r, g, b : string; s : string; begin if (Strs.Count > 1) and ( ((Length(Strs[0]) +1) div 25) > 1) then begin Bitmap.Width := (Length(Strs[0]) +1) div 25; Bitmap.Height := Strs.Count; Bitmap.PixelFormat := pf24bit; x := Bitmap.Width; ScanlinePtr := Bitmap.Scanline[0]; ScanlineIncrement := integer(Bitmap.Scanline[1]) - integer(ScanlinePtr); LastScanline := ScanlinePtr; Inc(LastScanLine, ScanlineIncrement * Bitmap.Height); r := '00000000'; g := '00000000'; b := '00000000'; i := 0; repeat Line := pRGBArray(ScanLinePtr); s := Strs[i]; xx := 1; n := 0; while (n < x) and (xx +6 <= Length(s)) do begin MoveMemory(@r[1], @s[xx], 8); MoveMemory(@g[1], @s[xx +8], 8); MoveMemory(@b[1], @s[xx +16], 8); Line[n].rgbtRed := StrToByte(r); Line[n].rgbtGreen := StrToByte(g); Line[n].rgbtBlue := StrToByte(b); Inc(n); Inc(xx, 25); end; Inc(i); Inc(ScanlinePtr, ScanlineIncrement); // move to the next scanline until (ScanlinePtr = LastScanline) or (i +1 >= Strs.Count); end; end; lalu untuk memanggil proceure tersebut digunakan button dengan listring program sbb : procedure TForm1.Button5Click(Sender: TObject); //citra ke biner2[/b:fef82f978f] var bmp : TBitmap; Strs : TStringList; begin bmp := TBitmap.Create; Strs := TStringList.Create; try bmp.Width := Image1.Picture.Width; bmp.Height := Image1.Picture.Height; bmp.PixelFormat := pf24bit; bmp.Canvas.Draw(0, 0, Image1.Picture.Graphic); BitmapToStrs2(bmp, Strs); //save strings to a tmp file Strs.SaveToFile( ChangeFileExt(ParamStr(0), '.pmb') ); RichEdit1.Lines.Assign(Strs); finally Strs.Free; bmp.Free; end; end; [b:fef82f978f]procedure TForm1.Button6Click(Sender: TObject); //biner ke citra2 var bmp : TBitmap; Strs : TStringList; begin bmp := TBitmap.Create; Strs := TStringList.Create; try // Strs.Assign(RichEdit1.Lines); //load the strings from the tmp file Strs.LoadFromFile( ChangeFileExt(ParamStr(0), '.pmb') ); StrsToBitmap2(bmp, Strs); Image2.Picture.Assign(bmp); finally Strs.Free; bmp.Free; end; end; program ini jalan....tapi procedure StrsToBitmap2 dan procedure BitmapToStrs2 saya ga ngerti maksudnya.... maka dari itu saya mengharapkan teman-teman di delphi-id.org ini dapat berbagi pengalaman (ya....membantu gitu....) untuk coba menjelaskan arti dari listing program tersebut.....(mungkin teman teman bisa menjelaskannya di samping kanan program di setiap baris nya).. saya sangat mengharapkan sekali bantuan dari teman teman.... saya minta maaf jika pertanyaan saya kurang berkenan di hati teman-teman.. tapi yang jelas saya sangat mengharapkan sekali bantuan dari teman-teman... terimakasih........ salam.....
user image
more 13 years ago

belajaraja

procedure BitmapToStrs2(Bitmap: TBitmap; Strs: TStrings); type TRGBArray = ARRAY OF TRGBTriple; // pf24bit pRGBArray = ^TRGBArray; var ScanlinePtr : PByte; ScanlineIncrement : integer; LastScanline : PByte; x : integer; Line: pRGBArray; n, xx : integer; r, g, b : string; s : string; begin Assert(Bitmap.PixelFormat = pf24bit); // ! must be pf24bit // gunanya untuk memproteksi, kalo ngga salah ini adalah jenis class x := Bitmap.Width; s := StringOfChar(#32, (x 24)+(x -1)); Strs.Clear; ScanlinePtr := Bitmap.Scanline[0]; ScanlineIncrement := integer(Bitmap.Scanline[1]) - integer(ScanlinePtr); LastScanline := ScanlinePtr; Inc(LastScanLine, ScanlineIncrement Bitmap.Height); repeat Line := pRGBArray(ScanLinePtr); xx := 1; for n := 0 to x -1 do begin r := ByteToStr(Line[n].rgbtRed); //merubah dari byte ke string g := ByteToStr(Line[n].rgbtGreen); b := ByteToStr(Line[n].rgbtBlue); MoveMemory(@s[xx], @r[1], ; //kalo ngga salah ini bahsa assembly untuk memindahkan dari... sejauh..... MoveMemory(@s[xx +8], @g[1], ; MoveMemory(@s[xx +16], @b[1], ; Inc(xx, 25); // untuk penambahan end; Strs.Add(s); Inc(ScanlinePtr, ScanlineIncrement); // move to the next scanline until (ScanlinePtr = LastScanline); end;
user image
more 13 years ago

sketsa

mas "belajaraja" terimakasih banyak ya..... mudah mudahan allah membalas kebaikan mas.... amin... trus barangkali mas tau, ScanlinePtr : PByte; (artinya apa sich? Pbyte itu tipe variabel untuk apa?) makasih mas.....
user image
more 13 years ago

pebbie

PByte : go find declaration ~> Pointer to byte
user image
more 13 years ago

dannytux

ya kalo tidak salah PByte itu mirip dengan PChar yah.... jadi yang disimpan adalah alamat variabel bukan nilai asli dari variable tersebut..... mohon maaf kalau salah..... saya juga baru belajar delphi...
user image
more 13 years ago

sketsa

ok...trimakasih banyak semuanya ya... trus ada lagi permasalahan.... mungkin (sedikit) saya dah agak ngerti ma listing program diatas....meskipun ada sesedikit yg masiih g ngerti... saya mau nanya,,,(mudah-mudahan teman-teman bisa membantu....AMIN.....) ada yang tau ga ya.... kira kira gimana algorima untuk kompresi image menggunakan metode run-length... saya mengharapkan tanggapan dari teman-teman semua.... baik itu berupa jawaban atau pun memberikan reverensi (alamat mana yang harus saya kunjungi)... untuk segala sesuatunya.....saya ucapkan terimakasih.... salam...
user image
more 13 years ago

dannytux

setahu aku ,metode kompresi tuh ada banyak : Huffman, biasa untuk JPEG Baseline, Arithmatic Coding, dan Run Length Encoding Coba search si wikipedia pasti ada.... Atau coba cari buku math atau kompresi ( e-book) di www.flazx.com
more ...
  • Pages:
  • 1
Share to

Random Topic

Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com