Ga naar inhoud

[Delphi] Jpeg verkleinen


anoniem

Aanbevolen berichten

Ik ben bezig met een proggie waarmee ik een artikelbestand kan bekijken en/of wijzigen. In dat artikelbestand zit ook een foto van het desbetreffende artikel. De bedoeling is dat ik op een knop 'bladeren...' kan klikken, m.b.v. een OpenPictureDialog een bestand kan kiezen, dat verkleind wordt naar 150x100 pixels (met nauwelijks kwaliteitsverlies), en vervolgens wordt weergegeven in een DBImage. Alles is gelukt, behalve het verkleinen. Vervolgens moet het verkleinde plaatje in de DBImage in de database worden gestopt. Weet iemand hoe dat moet? PS: De code voor de knop 'bladeren' op dit moment: [code:1:820a0d1ca5] procedure TArtikelenForm.Button1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end; end; [/code:1:820a0d1ca5]
Link naar reactie
Okee hier is het antwoord (je kan in dit geval alleen BMP bestanden openen en ze worden ook als BMP opgeslagen): [code:1:5b8f0da8b8] procedure TForm1.Button1Click(Sender: TObject); const // Nieuwe breedte en hoogte, deze kan je zelf aanpassen Breedte = 100; Hoogte = 150; var // Bestandsnamen OrigineelBestand, NieuwBestand: String; // Images Origineel, Nieuw: TImage; begin // Bestand openen en vragen waar hij opgeslagen moet worden if opdOpenen.Execute and spdOpslaan.Execute then begin OrigineelBestand := opdOpenen.FileName; NieuwBestand := spdOpslaan.FileName; end else // EXIT komt uit het oude Turbo Pascal en breekt de procedure af; hij stopt hier EXIT; // Originele plaatje aanmaken en instellen Origineel := TImage.Create(Application); Origineel.Picture.LoadFromFile(OrigineelBestand); Origineel.Stretch := True; Origineel.Width := Breedte; Origineel.Height := Hoogte; // Nieuwe plaatje maken en overnemen Nieuw := TImage.Create(Application); Nieuw.Width := Origineel.Width; Nieuw.Height := Origineel.Height; Nieuw.Canvas.StretchDraw(Rect(0, 0, Breedte, Hoogte), Origineel.Picture.Graphic); Nieuw.Picture.SaveToFile(NieuwBestand); // Free moet altijd na een Create!!! Anders blijft het in het geheugen achter!! Origineel.Free; Nieuw.Free; end; [/code:1:5b8f0da8b8] Het commentaar spreekt voorzich denk ik. Succes, Johan
Link naar reactie
Johan, ik ben er helemaal zelf uit gekomen! Weet jij trouwens hoe ik de inhoud van DBImage weer kan wissen? PS: Voor DBImage heb ik een nieuw component geïnstalleerd die wel JPEG accepteert, had ik problemen mee, weet je nog? [code:1:7ff7cc4452] function TArtikelenForm.ZoomBitmap(Img1: TBitmap; ZoomFactor:Real;Sender: TObject): TBitmap; begin Result := TBitmap.Create; Result.PixelFormat := Img1.PixelFormat; Result.Palette := Img1.Palette; Result.Width := Round(Img1.Width * ZoomFactor); Result.Height := Round(Img1.Height * ZoomFactor); Result.Canvas.StretchDraw(Rect(0,0,Result.Width, Result.Height),Img1); end; procedure TArtikelenForm.Button1Click(Sender: TObject); var MyBMP : TBitmap; MyJPEG : TJPEGImage; ZFactr:Real; begin if OpenPictureDialog1.Execute then begin try Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); except on EInvalidGraphic do Image1.Picture.Graphic := nil; end; Image1.Stretch:= False; MyJPEG := TJPEGImage(Image1.Picture.Graphic); with MyJPEG do begin MyBMP := TBitmap.Create; with MyBMP do begin Width := MyJPEG.Width; Height := MyJPEG.Height; Assign(Myjpeg); ArtikelenForm.Canvas.Draw(0,0,MyJPEG); Refresh; ZFactr := StrToFloat(Edit1.Text); DBImage1.Width := Round(Image1.Picture.Width * Zfactr); DBImage1.Height := Round(Image1.Picture.Height * Zfactr); DBImage1.Picture.graphic := ZoomBitmap(MyBmp,Zfactr,Self); assign(DBImage1.Picture.graphic); end; With MyJpeg do begin assign(DBImage1.Picture.graphic); end; end; end; end; [/code:1:7ff7cc4452] Weet jij trouwens hoe ik de inhoud van DBImage weer kan wissen?
Link naar reactie
Goedzo! :D Je leer het wel... Dit is echt goed hoor! Misschien nog iets beter inspringen voor betere leesbaarheid maar verder is het heel goed! [quote:e1b7a44e13="George W. Bush"][code:1:e1b7a44e13] function TArtikelenForm.ZoomBitmap(Img1: TBitmap; ZoomFactor:Real;Sender: TObject): TBitmap; [/code:1:e1b7a44e13][/quote:e1b7a44e13] De Sender hoeft er niet bij hoor, deze gebruik je hier niet. [quote:e1b7a44e13="Jitser"][code:1:e1b7a44e13] begin Result := TBitmap.Create; Result.PixelFormat := Img1.PixelFormat; Result.Palette := Img1.Palette; Result.Width := Round(Img1.Width * ZoomFactor); Result.Height := Round(Img1.Height * ZoomFactor); Result.Canvas.StretchDraw(Rect(0,0,Result.Width, Result.Height),Img1); end; [/code:1:e1b7a44e13] Weet jij trouwens hoe ik de inhoud van DBImage weer kan wissen?[/quote:e1b7a44e13] Jah... DBImage1.Picture := nil; En dan opslaan? :roll: volgens mij werkt dat wel! Ga zo door :wink:
Link naar reactie
DBImage1.Picture := nil; werkt idd. Bedankt. Ik heb echter nog een probleem met het ID. Dit moet een uniek nummer zijn en staat op auto_increment. Als ik een nieuw artikel wil toevoegen krijg ik keurig het laatst gebruikte ID + 1. Als je echter na het toevoegen, meteen nog een artikel wil toevoegen gaat hij niet naar het volgende nummer maar blijft hij bij dat nummer van het vorige artikel steken. Waar ligt dat aan? Dit is de code waarmee ik een nieuw record start: [code:1:71bee96316] procedure TArtikelenForm.ToolButton2Click(Sender: TObject); var ArtikelIDD: Integer; begin If not ArtikelenTabel.Eof then ArtikelenTabel.Refresh; ArtikelenTabel.Last; ArtikelenTabel.Insert; ArtikelIDQuery.Open; ArtikelIDD := ArtikelIDQuery.FieldByName('ArtikelID').AsInteger; DBEdit1.text := IntToStr(ArtikelIDD+1); end; [/code:1:71bee96316] Toevoegen doe heel simpel via ArtikelenTabel.Post;.
Link naar reactie
Vast wel :) Eens kijken...[code:1:f454926960]procedure TArtikelenForm.ToolButton2Click(Sender: TObject); var ArtikelIDD: Integer; begin if not ArtikelenTabel.Eof then begin ArtikelenTabel.Refresh; ArtikelenTabel.Last; ArtikelenTabel.Insert; ArtikelIDQuery.Open; ArtikelIDD := ArtikelIDQuery.FieldByName('ArtikelID').AsInteger; DBEdit1.text := IntToStr(ArtikelIDD+1); end; end;[/code:1:f454926960] Wat is ArtikelIDD voor object? En waar gebruik je ArtikelIDQuery voor? Ik denk dat je hier met een Query en met een Tabel dezelfde tabel opent...
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...