Obrazek po zmianie rozmiarów nie zmienia się po zapisie

0

To znowu ja. Chcę, aby mój program zmieniał rozmiar obrazka i zapisał go na pulpicie. Wczytuj najpierw przez OpenPictureDialog1.execute. Rozmiary zmienia się w programie ruszając suwakiem (początkowo ustawiony jest po środku na 50). W programie widać jak się zmienia, jednak po kliknięciu "zapisz", zapisuje się w takich samych rozmiarach jakich był na początku. Oto fragment kodu:

procedure TForm1.Button2Click(Sender: TObject); // przycisk zapisz
begin
Image1.Picture.SaveToFile('C:\Documents and Settings\Frankensztajn\Pulpit\obrazek.jpg');
end;

procedure TForm1.TrackBar1Change(Sender: TObject); //suwak
begin
Image1.Picture.LoadFromFile(openpicturedialog1.FileName);
Image1.Width := Image1.Picture.Width;
Image1.Height := Image1.Picture.Height;
Image1.Width :=round(Image1.Width*trackbar1.position*2/100);
Image1.Height :=round(Image1.Height*trackbar1.position*2/100);
Image1.Stretch := true;
end;  

Jak zrobić, aby obrazek zapisał się w zmienionej rozdzielczości?

0

Bo zmieniasz rozmiary komponentu, a nie fizycznie obrazka. Należy zrobić coś takiego,
jak w kodzie źródłowym programu pod poniższym linkiem. Patrz na kod TransformJPG:
http://www.speedyshare.com/files/22253479/jpg_res.rar

0

Jakoś nie mogę się połapać. Pokopiowałem jakieś fragmenty, kompiluje się, ale i tak przy próbie zapisu wyskakuje błąd i tworzy się pusty jpeg. Nie wiem czy jest sens wklejać kod, ja w ogóle go nie ogarniam.

procedure TForm1.Button1Click(Sender: TObject);
begin
  if openpicturedialog1.execute then
     Image1.Picture.LoadFromFile(openpicturedialog1.FileName);


end;

procedure TForm1.Button2Click(Sender: TObject);
begin
NewJPEG.SaveToFile('C:\Documents and Settings\Piotrek\Pulpit\obrazek.jpg');
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
     OldJPEG := TJPEGImage.Create;
     NewJPEG := TJPEGImage.Create;
     OldBitmap := TBitmap.Create;
     NewBitmap := TBitmap.Create;
Image1.Picture.LoadFromFile(openpicturedialog1.FileName);
Image1.Width := Image1.Picture.Width;
NewBitmap.Width := Image1.Picture.Width;
Image1.Height := Image1.Picture.Height;
NewBitmap.Height := Image1.Picture.Height;
Image1.Width :=round(Image1.Width*trackbar1.position*2/100);
NewBitmap.Width :=round(Image1.Width*trackbar1.position*2/100);
Image1.Height :=round(Image1.Height*trackbar1.position*2/100);
NewBitmap.Height :=round(Image1.Height*trackbar1.position*2/100);
Image1.Stretch := true;
NewJPEG.Assign(NewBitmap);
end; 
0

Uparciuch z Ciebie, kominujesz i zgadujesz zamiast pomyśleć, bo nie robisz zmiany rozdzielczości w taki sposób jak należy.
Brakuje u Ciebie podstawowej istrukcji StretchDraw. Poza tym jaki sens ma na nowo operowanie na jpegu oraz bitmapie w
OnChange dla TrackBara. Zmień tylko obrazek na podglądzie, a konwersji rozdzielczości wykonaj po kliknięciu na przycisk.
Użyj kodu poniżej. A i moduł jpeg musi być sekcji uses. Używasz tak: TransformJPG(300, 100, 'D:\wej.jpg', 'D:\wy.jpg');
A i dodam, że jeżeli program Twój ma być uniwersalny to zapis pliku na pulpicie rób nie poprzez podawanie ściezki, tak na
"sztywno" - w googlach znajdź odpowiednie przykłady funkcji w Delphi, które zwracają ścieżki do katalogów systemowych.

procedure TransformJPG(ResX, ResY : Word; SourceFileName, DestinationFileName : string);
var
  OldJPEG : TJPEGImage;
  NewJPEG : TJPEGImage;
  OldBitmap : TBitmap;
  NewBitmap : TBitmap;
begin
  if (SourceFileName <> '') and (DestinationFileName <> '') then
  begin
    OldJPEG := TJPEGImage.Create;
    NewJPEG := TJPEGImage.Create;
    OldBitmap := TBitmap.Create;
    NewBitmap := TBitmap.Create;
    try
      OldJPEG.LoadFromFile(SourceFileName);
      OldBitmap.Height := OldJPEG.Height;
      OldBitmap.Width := OldJPEG.Width;
      OldBitmap.Assign(OldJPEG);
      NewBitmap.Width := ResX;
      NewBitmap.Height := ResY;
      NewBitmap.Canvas.StretchDraw(NewBitmap.Canvas.ClipRect, OldBitmap);
      NewJPEG.Assign(NewBitmap);
      try
        NewJPEG.SaveToFile(DestinationFileName);
      except
        raise Exception.Create('Nie można zapisać do pliku: ' + DestinationFileName);
      end;
    finally
      OldJPEG.Free;
      NewBitmap.Free;
      OldBitmap.Free;
      NewJPEG.Free;
    end;
  end;
end;
0

Sory, za zawracanie gitary, ale teraz wychodzą mi jakieś dziwne powiększone fragmenty obrazków po kliknięciu przycisku zapisz:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if openpicturedialog1.execute then
     Image1.Picture.LoadFromFile(openpicturedialog1.FileName);


end;

procedure TransformJPG(ResX, ResY : Word; SourceFileName, DestinationFileName : string);
var
  OldJPEG : TJPEGImage;
  NewJPEG : TJPEGImage;
  OldBitmap : TBitmap;
  NewBitmap : TBitmap;
begin
  if (SourceFileName <> '') and (DestinationFileName <> '') then
  begin
    OldJPEG := TJPEGImage.Create;
    NewJPEG := TJPEGImage.Create;
    OldBitmap := TBitmap.Create;
    NewBitmap := TBitmap.Create;
    try
      OldJPEG.LoadFromFile(SourceFileName);
      OldBitmap.Height := OldJPEG.Height;
      OldBitmap.Width := OldJPEG.Width;
      OldBitmap.Assign(OldJPEG);
      NewBitmap.Width := ResX;
      NewBitmap.Height := ResY;
      NewBitmap.Canvas.StretchDraw(NewBitmap.Canvas.ClipRect, OldBitmap);
      NewJPEG.Assign(NewBitmap);
      try
        NewJPEG.SaveToFile(DestinationFileName);
      except
        raise Exception.Create('Nie można zapisać do pliku: ' + DestinationFileName);
      end;
    finally
      OldJPEG.Free;
      NewBitmap.Free;
      OldBitmap.Free;
      NewJPEG.Free;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
TransformJPG(Image1.Width,Image1.Height,openpicturedialog1.FileName,'C:\obrazek.jpg');  //później się pomyśli nad ścieżką
end;



procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Image1.Picture.LoadFromFile(openpicturedialog1.FileName);
Image1.Width := Image1.Picture.Width;
Image1.Height := Image1.Picture.Height;
Image1.Width :=round(Image1.Width*trackbar1.position*2/100);
Image1.Height :=round(Image1.Height*trackbar1.position*2/100);
Image1.Stretch := true;
label1.caption:=IntToStr(Image1.Width)+' x '+IntToStr(Image1.Height);
end;          
0

Frankensztajn: OGARNIJ SIĘ! Dostałeś gotową przetestowaną oraz działającą procedurę i przykład jej użycia.
To dlaczego z niej nie skorzystasz? A dalej uparcie kombinujesz po swojemu. Ręce opadają - rób jak chcesz.

0

Skopiowałem tą funkcję, przecież jest w kodzie, to jak robię po swojemu? Funkcja jest wywoływana przyciskiem button2 i wtedy tworzy się plik taki jak podany jako ostatni argument tego transformjpg, a po otworzeniu tego pliku jest jakiś pochrzaniony obrazek. Miał się pomniejszyć, a jest wycięty fragment oryginału.

0

To nie mam pojęcia u mnie ta funkcja działa. A widzisz nie formatujesz kodu nie umieszczasz go
w znacznikach delphi stąd nie widziałem w ogóle że tam jest moja procedura. A zobacz sobie na
żródła plus plik wykonywalny pod poniższym adresem. Bez problemów zmienia mi rozdzielczość
tylko te regulowanie za pomocą trackbara daje nieco inny rozmiar niż później widać, na przykład
w IrfanView, bo nieco mniejszy pokazuje ten mój program. Także nie wiem jakim cudem Ty - po
tej zmianie rodzielczości masz tylko wycinek, moja procedura (a nie funkcja jak źle napisałeś), z
tego co mi się wydaje powinna zmieniać rozdzielczośc prawidlowo bez względu na użyte Delphi i
rodzaj Windowsa. Na przyszlość to formatuj kod robiąc wcięcia i wklejaj go, w odpowiednie tagi.
http://www.speedyshare.com/files/22267249/zmiana_rozdzielczosci.rar

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