Zmiana rozdzielczości plików graficznych (jpg)

0

Pisze program do generowania stron internetowych zawierających galerie zdjęć. W tym celu musze zmieniać rozdzielczość plików graficznych, które bedą używane jako min. miniaturki. Jeżeli znacie jakiś komponent lub sposób na zmiane wielkości plików jpg to bardzo prosze o odpowiedź!!! Ścieżki do plików pobieram z elementu TListBox. Chciałbym zmieniać ich rozdzielczość i zapisywać do odpowiedniego katalogu na dysku...

wszystko co znalazłem na ten temat jest tu (problem w tym, że jestem początkującym i nie bardzo wiem jak się do tego zabrać):

Kod wyciety z programu, po niewielkich modyfikacjach powinien dzialac

{-----------------------------------------------------------------------}
{ Skalowanie metodą interpolacji dwuliniowej
{-----------------------------------------------------------------------}
procedure TForm1.ScalBilinearInterpolation(var sorc : TImage; var des : TImage);
var i, j, c : Integer;
cx, cy, z, s : Integer;
p, q, rx, ry : Single;
ln : PByteArray;
begin
{ wyliczenie współczynników }
p := des.Width/sorc.Width;
q := des.Height/sorc.Height;
{ skalowanie }
for j:=0 to des.Height-1 do begin
Division(j/q, cy, ry);
ln := des.Picture.Bitmap.ScanLine[j];
c := 0;
for i:=0 to des.Width-1 do begin
Division(i/p, cx, rx);
z := cx*3;
if cx<sorc.Width-1 then s := z + 3 else s := z;
ln[c+2] := BiLinearInterpolate(li[cy][z+2], li[cy][s+2], li[cy+1][z+2], li[cy+1][s+2], rx, ry); //red
ln[c+1] := BiLinearInterpolate(li[cy][z+1], li[cy][s+1], li[cy+1][z+1], li[cy+1][s+1], rx, ry); //green

    ln[c]   := BiLinearInterpolate(li[cy][z]  , li[cy][s]  , li[cy+1][z]  , li[cy+1][s]  , rx, ry); //blue
    c := c + 3;
  end;
end;

end;

function TForm1.BiLinearInterpolate(c1, c2, c3, c4 : Byte; dx, dy : Single):Byte;
var a, b, c : Single;
begin
{ interpolacja wzdluz osi x }
a := c1 + (c2-c1)*dx;
b := c3 + (c4-c3)*dx;
{ interpolacja wzdluz osi y }
c := a + (b-a)*dy;

0

No jeśli kod się kompiluje to w czym problem?

0

Miałem kiedyś podobny problem i darowałem sobie programową zmianę rozdzielczości JPGów. Da się to zrobić, natomiast w moim programie zdjęcia znacznie traciły na jakości lub pojawiały się różne dziwne kropki.
Obecnie korzystam z makra w Corelu. Jest szybko jak i ładnie :)

0
endrique napisał(a)

Miałem kiedyś podobny problem i darowałem sobie programową zmianę rozdzielczości JPGów. Da się to zrobić, natomiast w moim programie zdjęcia znacznie traciły na jakości lub pojawiały się różne dziwne kropki.
Obecnie korzystam z makra w Corelu. Jest szybko jak i ładnie :)

A mógłbyś napisać jak to robiłeś? Program ten piszę na zaliczenie semestru i zmiana rozdzielczości jpg bardzo by mi się przydała... Ewentualnie bedę je pomniejszał w html'u ale to nie ma sensu skoro zmniejsze tylko wielkość a nie rozmiar...
Poza tym jeśli dobrze rozumiem wyżej zamieszczony kod, to działa on na bitmapy, a mi potrzebna jest zmiana wielkości JPG.

0

Nie dalej jak na poczatku roku mialem z tym problem.
Powinno to byc jeszcze w postach.
Udalo mi sie zrobic to bez najmniejszego problemu.
Dodatkowo program rozroznia czy zdjecie jest poziome czy pionowe i odpowiednio skaluje aby na stronie WWW szerokosci zdjec (niezaleznie czy pionowych czy poziomych) byly takie same :-)

Poszukaj. Powinno to gdzies byc.
Jak nie znajdziesz to pisz na adres Novitius'a

0
procedure TForm1.Button1Click(Sender: TObject);
var
  JPG : TJPEGImage;
  BMP  : TBitmap;
  NewHeight, NewWidth : Integer;
begin
  JPG := TJPEGImage.Create;
  BMP := TBitmap.Create;
  try
    JPG.LoadFromFile('C:\test.jpg');
    BMP.Assign(JPG);

    NewHeight := BMP.Height div 2; //tu ustawiamy jaką wielkośc ma mieć pomniejszony obrazek
    NewWidth := BMP.Width div 2;

    BMP.Canvas.StretchDraw(Rect(0, 0, NewWidth, NewHeight), BMP);
    BMP.Width := NewWidth;
    BMP.Height := NewHeight;
    JPG.Assign(BMP);
    JPG.SaveToFile('C:\test_resize.jpg');
  finally
    BMP.Free;
    JPG.Free;
  end;
end;
0

Dominik właśnie o to mi chodziło!!!
Doszedłem już do tego, że muszę użyć klasy TJPGImage, nie wiedzialem jednak, że nie ma ona fukcji zmiany takich parametrów jak szerokość i wysokość obrazka, a które można znaleźć w TBitmap. Jak jutro zalicze kolosa z matmy, wezme się za ten kod.
Dziękuje wszystkim za pomoc!

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