Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fehler bei JPEG-Umwandlung (https://www.delphipraxis.net/110648-fehler-bei-jpeg-umwandlung.html)

SimStar001 21. Mär 2008 15:58


Fehler bei JPEG-Umwandlung
 
Hallo, ich habe ein Problem bei dem ich nicht mehr weiter weiß.

Ich erzeuge ein Bild in einem Image. Dieses ist 4000x6000 Pixel groß.

Ich muss nun dieses Bild als JPEG speichern, da eine BMP 115 MB groß wäre.

hier ist mein Code:

Delphi-Quellcode:
form16.Rechnung.Picture.Graphic.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');
        Bild := TJPEGIMAGE.create;
        Bild.Assign(form16.Rechnung.Picture.Bitmap);
        Bild.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.jpeg');
        bild.Free;

Wie ihr sehen könnt, gehe ich den Umweg das Image erst als bmp zu speichern, was ca 30 sek dauert, um es dann wieder zu laden und dann umzuwandel!

das klappt soweit sehr gut.

Nur wenn ich das bild nich abspeichere, sondern gleich als JPEG umwandel, dann bekomm ich eine Fehlermeldung, dass net genügend Speicher vorhanden wäre!????????????????

Hier der Code:


Delphi-Quellcode:
        Bild := TJPEGIMAGE.create;
        Bild.Assign(form16.Rechnung.Picture.Bitmap);
        Bild.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.jpeg');
        bild.Free;

Wieso klappt das net, sondern muss ich den Umweg gehen!? hat jemand eine Idee wieso, und was ich anders machen kann!?


vielen dank

Flips 21. Mär 2008 18:30

Re: Fehler bei JPEG-Umwandlung
 
Also ich hab hier ein Bitmap mit 250mb und es geht ;-)
Naja probiers mal mit ner Pufferung übern Memorystream, vielleicht klappt das besser (weiß aber nicht, ob es überhaupt etwas bringt :oops: )

Delphi-Quellcode:
var ms: TMemoryStream;
bmp : TBitmap;
jpg : TJPEGImage;
//[...]  
ms := TMemoryStream.Create;
try
  ms.LoadFromFile('a.bmp');
  bmp := TBitmap.Create;
  try
    bmp.LoadFromStream(ms);
    try
       jpg := TJPEGImage.Create;
       jpg.Assign(bmp);
       jpg.SaveToFile('a.jpg');
      finally
        FreeAndNil(jpg);
      end;
    finally
      FreeAndNil(bmp);
    end;
  finally
    FreeAndNil(ms);
  end;

Fussball-Robby 21. Mär 2008 19:17

Re: Fehler bei JPEG-Umwandlung
 
Lad doch mal den gesamten Quelltext hoch, dann kann ich mal ausprobieren, ob der Fehler bei mir auch kommt und dir gegebenenfalls helfen.

Mfg

SimStar001 22. Mär 2008 07:10

Re: Fehler bei JPEG-Umwandlung
 
das mit dem memory stream ist ganz gut, nur will ich die bmp vorher nicht erstauf der festplatte speichern, sondern direkt ausdem programm umwandeln!


dein code sieh aber net danach aus!



so und hier jetzt der komlette code!




Delphi-Quellcode:
procedure TFRechnung.Button4Click(Sender: TObject);
var Eintrag, tmp : string;
    i , u ,breite,hoehe: integer;
    Preis : extended;
    Tabellenanfang , Artikel_von_letzter_seite : integer;
    year, month , day : word;
    Zahldatum : string;
    datum : tdate;
     bild : TJPEGIMAGE;
     zeit1 , zeit2 : tdatetime;
     pic : TJPEGImage;
begin


  Seitenanzahl := 1;
  Aktuelle_Seite := 1;
  Aktuelle_rechnung.Clear;

  if edit4.Text = '' then
    begin
    showmessage('Bitte wählen Sie einen Kunden aus!');
    exit;
    end;

  if edit5.Text = '' then
    begin
    showmessage('Bitte geben Sie das Rechnungsdatum an!');
    edit5.SetFocus;
    exit;
    end;

  if edit6.Text = '' then
    begin
    showmessage('Bitte geben Sie das Lieferdatum an!');
    edit6.SetFocus;
    exit;
    end;

  if (edit7.Text = '') or (stringgrid1.RowCount - 1 = 0) then
    begin
    showmessage('Bitte wählen Sie mindestens einen Artikel aus!');
    exit;
    end;

  rechnungNr := ReNr(edit4.Text);

 

    with Rechnung.canvas do
      begin
      pen.color := clwhite;
      brush.color := clwhite;
      font.color := clblack;
      font.name := 'Arial';
      font.Size := 66;

      //Addresskopf
      textout(550,550,'Sabine Mucha');
      textout(550,660,'Calvisiusstraße 31');
      textout(550,770,'04177 Leipzig');

      //Datum
      textout(3135,1980,'Leipzig, den ' + edit5.text);


      // Addreskopf Kunde
      textout(550,1320,edit1.text);
      textout(550,1430,edit2.text);
      textout(550,1540,edit3.text);
      textout(550,1650,'KdNr.: ' + edit4.Text);

      Aktuelle_rechnung.Add(edit4.Text);
      Aktuelle_rechnung.Add(edit1.Text);
      Aktuelle_rechnung.Add(edit2.Text);
      Aktuelle_rechnung.Add(edit3.Text);
      Aktuelle_rechnung.Add(edit5.text);

      //Betreffkopf
      font.Style := [fsbold];
      textout(550,2310,'Rechnung Nr.: '+ RechnungNr);
      font.Style := [];

      Aktuelle_rechnung.Add(RechnungNr);

      //Anrede
      Eintrag := Kundendatei.strings[AktuellerKunde];
      Eintrag := copy(Eintrag,pos('{',Eintrag) + 1, length(Eintrag));
      tmp := copy(Eintrag,1,pos('{',Eintrag) - 1);
      Eintrag := copy(Eintrag,pos('{',Eintrag) + 1, length(Eintrag));
      if tmp = 'Herr' then
        textout(550,2750,'Sehr geehrter Herr ' + copy(Eintrag,1,pos('{',Eintrag) - 1 ) + ',')
          else
            textout(550,2750,'Sehr geehrte Frau ' + copy(Eintrag,1,pos('{',Eintrag) - 1 ) + ',');

      // Text
      textout(550,2970,'am ' + edit6.Text + ' lieferten wir Ihnen wie folgt:');

      Aktuelle_rechnung.Add(edit6.text);

      // Tabellenkopf
      font.Style := [fsbold];
      textout(550,3190,'Anzahl');
      textout(935,3190,'Bezeichnung');
      textout(2145,3190,'Einzelpreis');
      textout(2860,3190,'Gesamtpreis');

      pen.Width := 6;
      pen.Color := clblack;
      moveto(533,3289);
      lineto(533,3173);
      lineto(3410,3173);
      lineto(3410,3289);
      lineto(533,3289);
      moveto(918,3173);
      lineto(918,3289);
      moveto(2128,3173);
      lineto(2128,3289);
      moveto(2843,3173);
      lineto(2843,3289);


      Tabellenanfang := 3300;
      Artikel_von_letzter_seite := 0;
      // Tabelleneinträge
      font.Style := [];
      if FRechnung.StringGrid1.RowCount > 1 then
        for i := 0 to FRechnung.StringGrid1.RowCount - 2 do
          begin

          if (i > 23 ) and (Artikel_von_letzter_seite = 0) then
            begin

            // Seite Speichern zum drucken
            Rechnung.Picture.Graphic.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');
            Bild := TJPEGIMAGE.create;
            Bild.Assign(Rechnung.Picture.Bitmap);
            Bild.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.jpeg');
            bild.Free;
            deletefile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');

            Tabellenanfang := 550;
            inc(Seitenanzahl);
            inc(Aktuelle_Seite);
            Artikel_von_letzter_seite := i;
            with Rechnung.Canvas do
              begin
              pen.Color := clwhite;
              rectangle(0,0,4548,6660);
              pen.Color := clblack;
              pen.Width := 6;
              moveto(533,533);
              lineto(3410,533);
              end;
            end;




          if (Tabellenanfang + (i - Artikel_von_letzter_seite) * 110) > 5665 then
            begin
            Tabellenanfang := 550;
            inc(Seitenanzahl);

            // Seite speichern zum Drucken
            Rechnung.Picture.Graphic.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');
            Bild := TJPEGIMAGE.create;
            Bild.Assign(Rechnung.Picture.Bitmap);
            Bild.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.jpeg');
            bild.Free;
            deletefile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');

            inc(Aktuelle_Seite);
            Artikel_von_letzter_seite := i;
            with Rechnung.Canvas do
              begin
              pen.Color := clwhite;
              rectangle(0,0,4548,6660);
              pen.Color := clblack;
              pen.Width := 6;
              moveto(533,533);
              lineto(3410,533);
              end;
            end;


          Aktuelle_rechnung.Add(StringGrid1.Cells[2,i] + '}' + StringGrid1.Cells[0,i] + '}' + StringGrid1.Cells[1,i] + '}' + StringGrid1.Cells[3,i]);

          FRechnung.StringGrid1.cells[1,i] := Komma(copy(FRechnung.StringGrid1.cells[1,i],1,length(FRechnung.StringGrid1.cells[1,i]) - 1)) + '€';
          FRechnung.StringGrid1.cells[3,i] := Komma(copy(FRechnung.StringGrid1.cells[3,i],1,length(FRechnung.StringGrid1.cells[3,i]) - 1)) + '€';


          textout(550,Tabellenanfang + (i - Artikel_von_letzter_seite) * 110,copy(FRechnung.StringGrid1.Cells[2,i],1,length(FRechnung.StringGrid1.cells[2,i]) - 1));
          textout(935,Tabellenanfang + (i - Artikel_von_letzter_seite) * 110,FRechnung.StringGrid1.Cells[0,i]);

          textout(2733 - canvas.TextWidth(FRechnung.StringGrid1.cells[1,i]),Tabellenanfang + (i - Artikel_von_letzter_seite) * 110,FRechnung.StringGrid1.cells[1,i]);
          textout(3283 - canvas.TextWidth(FRechnung.StringGrid1.cells[3,i]),Tabellenanfang + (i - Artikel_von_letzter_seite) * 110,FRechnung.StringGrid1.cells[3,i]);

          pen.Width := 6;
          pen.Color := clblack;
          moveto(533,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
          lineto(3410,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);

          moveto(2931,Tabellenanfang - 2  + (i - Artikel_von_letzter_seite) * 110);
          lineto(2931,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
          moveto(918,Tabellenanfang - 2  + (i - Artikel_von_letzter_seite) * 110);
          lineto(918,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
          moveto(2128,Tabellenanfang - 2  + (i - Artikel_von_letzter_seite) * 110);
          lineto(2128,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
          moveto(2843,Tabellenanfang - 2  + (i - Artikel_von_letzter_seite) * 110);
          lineto(2843,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
          moveto(3410,Tabellenanfang - 2  + (i - Artikel_von_letzter_seite) * 110);
          lineto(3410,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);

          end;

        textout(2145,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 1) * 110,'Zzgl. 19% MwSt.');

        Preis := strtofloat(copy(FRechnung.Edit7.Text,1,length(FRechnung.Edit7.Text)));
        tmp := floattostr(roundto((Preis * 0.19),-2));
        tmp := Komma(tmp);
        Aktuelle_rechnung.Add(tmp);
        textout(3283 - canvas.TextWidth(tmp + '€'),Tabellenanfang + ((i - Artikel_von_letzter_seite) +1) * 110,tmp + '€');

        moveto(2128,Tabellenanfang - 2 + (i - Artikel_von_letzter_seite) * 110);
        lineto(2128,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
        lineto(3410,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
        lineto(3410,Tabellenanfang - 2 + (i - Artikel_von_letzter_seite) * 110);
        lineto(2128,Tabellenanfang - 2 + (i - Artikel_von_letzter_seite) * 110);
        moveto(2843,Tabellenanfang - 2 + (i - Artikel_von_letzter_seite) * 110);
        lineto(2843,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);

        moveto(2128,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
        lineto(2128,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 2) * 110);
        lineto(3410,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 2) * 110);
        lineto(3410,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
        lineto(2128,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
        moveto(2843,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 1) * 110);
        lineto(2843,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 2) * 110);

        tmp := floattostr(roundto((Preis * 1.19),-2));
        tmp := Komma(tmp);
        Aktuelle_rechnung.Add(tmp);
        font.Style := [fsbold];
        Textout(2145,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 2) * 110,'Gesamt');
        textout(3283 - canvas.TextWidth(tmp + '€'),Tabellenanfang + ((i - Artikel_von_letzter_seite) +2) * 110,tmp + '€');

        moveto(2128,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 2) * 110);
        lineto(2128,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 3) * 110);
        lineto(3410,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 3) * 110);
        lineto(3410,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 2) * 110);
        lineto(2128,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 2) * 110);
        moveto(2843,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 2) * 110);
        lineto(2843,Tabellenanfang - 2 + ((i - Artikel_von_letzter_seite) + 3) * 110);

        font.style := [];

        { TODO 1 : Neue Seiten Optionen einfügen }

        if Tabellenanfang + ((i - Artikel_von_letzter_seite) + 5) * 110 > 4977 then
            begin
            Tabellenanfang := 550;
            inc(Seitenanzahl);

            //Seite speichern zum Drucken
            Rechnung.Picture.Graphic.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');
            Bild := TJPEGIMAGE.create;
            Bild.Assign(Rechnung.Picture.Bitmap);
            Bild.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.jpeg');
            bild.Free;
            deletefile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');

            inc(Aktuelle_Seite);
            Artikel_von_letzter_seite := 0;
            i := - 5;
            with Rechnung.Canvas do
              begin
              pen.Color := clwhite;
              rectangle(0,0,4548,6660);
              pen.Color := clblack;
              pen.Width := 6;
              end;
            end;

        datum := strtodate(Frechnung.Edit5.Text);
        datum := datum + 14;
        Zahldatum := datetostr(datum);

        Aktuelle_rechnung.Add(Zahldatum);

        textout(550,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 5) * 110, 'Bitte überweisen Sie den o.a. fälligen Gesamtbetrag bis zum ' + Zahldatum + ' auf folgendes');
        textout(550,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 6) * 110, 'Konto:');
        textout(550,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 8) * 110, 'Bankinstitut:');
        textout(1210,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 8) * 110, 'Citibank');
        textout(550,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 9) * 110, 'BLZ:');
        textout(1210,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 9) * 110, '30020900');
        textout(550,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 10) * 110, 'Konto Nr.:');
        textout(1210,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 10) * 110, '3108624137');


        if Tabellenanfang + ((i - Artikel_von_letzter_seite) + 12) * 110 > 5197 then
            begin
            Tabellenanfang := 550;
            inc(Seitenanzahl);

            // Seite speichern zum Drucken
            Rechnung.Picture.Graphic.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');
            Bild := TJPEGIMAGE.create;
            Bild.Assign(Rechnung.Picture.Bitmap);
            Bild.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.jpeg');
            bild.Free;
            deletefile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');

            inc(Aktuelle_Seite);
            Artikel_von_letzter_seite := 0;
            i := - 12;
            with Rechnung.Canvas do
              begin
              pen.Color := clwhite;
              rectangle(0,0,4548,6660);
              pen.Color := clblack;
              pen.Width := 6;
              end;
            end;

        textout(550,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 12) * 110, 'Für weitere Fragen stehe ich Ihnen gerne unter der Rufnummer 01 63 / 4 67 46 55 zur');
        textout(550,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 13) * 110, 'Verfügung.');


        textout(550,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 16) * 110, 'Mit freundlichen Grüßen');
        textout(550,Tabellenanfang + ((i - Artikel_von_letzter_seite) + 21) * 110, 'Sabine Mucha');



        // Seite speichern zum Drucken
        Rechnung.Picture.Graphic.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');
        Bild := TJPEGIMAGE.create;
        Bild.Assign(Rechnung.Picture.Bitmap);
        Bild.savetofile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.jpeg');
        bild.Free;
        deletefile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Seite' + inttostr(Aktuelle_Seite) + '.bmp');


      end;


    Rechnungsdaten_Speichern('noch drucken','offen',RechnungNr,FRechnung.Edit4.Text,FRechnung.Edit5.Text,FRechnung.edit6.Text,Zahldatum,tmp);
    Aktuelle_rechnung.SaveToFile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\' + RechnungNr + '.dat');


  if not fileexists(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Rechnungsdaten.dat') then
    showmessage('Fehler beim Speichern der Rechnungsdaten! [Fehler: 022]')
      else
        Rechnungsdaten.LoadFromFile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Rechnungsdaten.dat');

  tmp := Rechnungsdaten.strings[Rechnungsdaten.Count - 1];

  if printdialog1.Execute then
    begin

    with printer do
      begin
      pic := TJPEGImage.create;
      Orientation := poPortrait;
      BeginDoc;
      for i := 1 to Seitenanzahl do
        begin

        if i < Seitenanzahl then
          NewPage;

        pic.LoadFromFile(extractfilepath(paramstr(0)) + 'Daten\Rechnungen\Seite' + inttostr(i) + '.jpeg');
        breite := GetDeviceCaps(Printer.Handle,Horzres);
        hoehe := GetDeviceCaps(Printer.Handle,Vertres);
        Canvas.StretchDraw(Rect(0,0,breite,Hoehe), pic);
        deleteFile(extractfilepath(paramstr(0)) + 'Daten\Rechnungen\Seite' + inttostr(i) + '.jpeg')
        end;
      EndDoc;
      pic.Free;
      tmp := stringreplace(tmp,'noch drucken','gedruckt',[]);
      Rechnungsdaten.strings[Rechnungsdaten.Count - 1] := tmp;
      Rechnungsdaten.SaveToFile(extractfilepath(paramstr(0)) + '\Daten\Rechnungen\Rechnungsdaten.dat');
      messagedlg('Die Rechnung wurde erfolgreich erstellt und wird jetzt gedruckt!',mtinformation,[mbok],0);
      end;
    end;

 { TODO : Rechnung schreiben in Verlauf eintragen }
  darfschliessen := true;
  FRechnung.Close;
  form1.Visible := true;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz