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

more 17 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.....

more 17 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;

more 17 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.....

more 17 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...

more 17 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...

more 17 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
reply |
Report Obsolete
AI Forward

🚀 We're thrilled to partner with Alibaba Cloud for "AI Forward - Alibaba Cloud Global Developer Summit 2025" in Jakarta! Join us and explore the future of AI. Register now:
https://int.alibabacloud.com/m/1000400772/
#AlibabaCloud #DeveloperSummit #Jakarta #AIFORWARD
Last Articles
Last Topic
- PascalTalk #6: (Podcast) Kuliah IT di luar negeri, susah gak sih?
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #5: UX: Research, Design and Engineer
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #4: Obrolan Ringan Seputar IT
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #2: Membuat Sendiri SMART HOME
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #3: RADically Fast and Easy Mobile Apps Development with Delphi
by LuriDarmawan in Tutorial & Community Project more 4 years ago - PascalTalk #1: Pemanfaatan Artificial Intelligence di Masa Covid-19
by LuriDarmawan in Tutorial & Community Project more 4 years ago - Tempat Latihan Posting
by LuriDarmawan in OOT more 5 years ago - Archive
- Looping lagi...
by idhiel in Hal umum tentang Pascal Indonesia more 12 years ago - [ask] koneksi ke ODBC user Dsn saat runtime dengan ado
by halimanh in FireBird more 12 years ago - Validasi menggunakan data tanggal
by mas_kofa in Hal umum tentang Pascal Indonesia more 12 years ago
Random Topic
- [tanya] data dbgrid ke new table
by jayadi888 in MySQL more 19 years ago - insert images dengan format GIF
by adit4it in Multimedia & Graphic Enhancement more 18 years ago - tanya tentang open file tanpa open dialog
by dpox in Network, Files, I/O & System more 17 years ago - Bagaimana ngeprint 1/2 HVS ?
by userdelphi in Lain-lain more 16 years ago - Cara hide childmdi ??
by purnomo2007 in Hal umum tentang Pascal Indonesia more 15 years ago - Mohon Do'anya
by saysansay in OOT more 16 years ago - cyber hacker
by lagisedih in Tip n Trik Pemrograman more 19 years ago - tanya xml di delphi (Mohon bantuannya)
by shinx in Tip n Trik Pemrograman more 16 years ago - Buat program untuk Air lines (pemesanan tiket)
by Brams in Tip n Trik Pemrograman more 17 years ago - Membuat 2 detail band dalam 1 quickreport, Bisakah?
by rudisbg in Reporting more 15 years ago