Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

[Delphi] Jpeg verkleinen

George W. Bush
11 antwoorden
  • 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]
  • Hee! Bekende vraag! Sorry dat ik niet antwoordde… had te weinig tijd en vergat het…

    Hoe wil je het plaatje opslaan in de database? Als BMP of JPG?

    Ik weet namelijk hoe het moet :D
  • 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
  • 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?
  • 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:
  • Ben trouwens benieuwd hoe dat eruit ziet…

    Waarom gebruik je hier geen Create bij MyJPEG?
  • 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;.
  • Ik denk dat je eerst een Post achter het statement moet zetten.
    Weet niet precies hoe dat met ZEOS gaat (is er nog niet voor Delphi 7), het is maar een probeerseltje…
  • Eerst een Post doen werkt niet, krijg de melding 'dataset not in edit or insert mode'

    Ik denk dat het probleem zit bij het feit dat het nummer uit een Query komt, maar de post enzo gaat via een Tabel.
    Bij de Post wordt de tabel bijgewerkt, maar de Query niet.

    Kan ik dit veranderen?
  • 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…
  • Aha dat is een integer… :lol: :lol:

    Probeer eens voor DBEdit.Text := … te zetten: ArtikelenTabel.Edit en daarna (dus na DBEdit.Text := …) ArtikelenTabel.Post.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.