JPG Compression Quality przegląd

0

Chciałem zrobić programik w którym porównał bym sobie tylko jak wygląda jpg o określonym stropniu kompresji.

Dałem na forme TrackBar z zakresem 1-100 i dwa image'y. jeden nie Visible i zawierający próbkę obrazja, drugi pusty z visible=true

Dałem o OnChange Trackbara taką prockę:
(user Jpeg)

procedure costam(Sender blah blah blah);
var jpg:TJpegImage;
begin
 jpg:=TJpegImage.Create;
 jpg.Assign(Image1.Picture.Graphic.Bitmap);
 jpg.CompressionQuality:=Trackbar1.Position;
 Image2.Picture.Graphic.Bitmap.Assign(jpg);
 jpg.Free;
end;

lub alternatywnie:

procedure costam(Sender blah blah blah);
var jpg:TJpegImage;
 bmp:TBitmap;
begin
 jpg:=TJpegImage.Create;
 jpg.Assign(Image1.Picture.Graphic.Bitmap);
 jpg.CompressionQuality:=Trackbar1.Position;
 bmp:=TBitmap.Create;
 bmp.Assign(jpg);
 Image2.Picture.Graphic.Bitmap.Assign(bmp);
 bmp.Free;
 jpg.Free;
end;

i procedury działają ... ale źle :( zawsze w Image2 pokazuje mi się obrazek o najwyższej jakości, niezależnie co zaznaczę na Trackbarze ...

natomiast kiedy robię tak:

procedure costam(Sender blah blah blah);
var jpg:TJpegImage;
 bmp:TBitmap;
begin
 jpg:=TJpegImage.Create;
 jpg.Assign(Image1.Picture.Graphic.Bitmap);
 jpg.CompressionQuality:=Trackbar1.Position;
 bmp:=TBitmap.Create;
 bmp.Assign(jpg);
 bmp.SaveToFile('c:\test.bmp');
 bmp.Free;
 Image2.Picture.LoadFromFile('c:\test.bmp');
 jpg.Free;
end;

to procedura działa, tylko trwa troche dłużej i jest to trochę bez sensu żeby zapisywać na dysk żeby to zobaczyć. Trochę dziwne ale zwracam się do was o pomoc.

0

procedure costam(Sender blah blah blah);
var jpg:TJpegImage;
bmp:TBitmap;
begin
jpg:=TJpegImage.Create;
jpg.Assign(Image1.Picture.Graphic.Bitmap);
jpg.CompressionQuality:=Trackbar1.Position;
jpg.needjpg lub compress (nie pamietam :P)
bmp:=TBitmap.Create;
bmp.Assign(jpg);
Image2.Picture.Graphic.Bitmap.Assign(bmp);
bmp.Free;
jpg.Free;
end;

0

Nawet jest w helpie

Forces the action of compression.

procedure Compress;

Description

Call Compress to compress for optimization, such as before streaming out when assigning a bitmap to a jpeg. Changing properties like CompressionQuality does not force compression. To force compression, call Compress.

0

dzięki bardzo bo nie mogłem nic wymyślić a nawet mi nie przyszło na myśl żeby zobaczyć do helpa. Kombinowałem ze sleepem myśląć że nie zdąża skompresować.

0

dzięki bardzo bo nie mogłem nic wymyślić a nawet mi nie przyszło na myśl żeby zobaczyć do helpa. Kombinowałem ze sleepem myśląć że nie zdąża skompresować.

To Sleep() niewiele by Ci pomógł :) . Z tego co się orientuję, to Sleep() stanowi informację dla systemu, że w określonym czasie nie należy przydzielać dla wątku czasu procesora, więc jeśli wywołałbyś Sleep() w tym samym wątku, w którym ma się rzekomo kompresować JPEG, to JPEG pospałby sobie w stanie raczej niezmienionym :)

0

dzisiaj dopiero postanowiłem sprawdzić to co mi napisaliście. i okazuje się niestety że działa tak jak działało. dalej jest cały czas taka sama jakość. Przypominam na formie Form1 jest Trackbar1, Image1.Visibled=false i Image2.Visibled=true i daje taką prockę:

procedure zmien;
var jpg:TJpegImage;
begin
 jpg:=TJpegImage.Create;
 jpg.Assign(Image1.Picture.Bitmap);
 jpg.CompressionQuality:=Trackbar1.Position;
 jpg.Compress;
 Image2.Picture.Bitmap.Assign(jpg);
 Image2.Repaint;
 jpg.Free;
end;
0

Powinno działać

1 użytkowników online, w tym zalogowanych: 0, gości: 1