|
Antwort |
Registriert seit: 18. Jan 2008 594 Beiträge |
#1
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
Marco Tröger
|
Zitat |
Registriert seit: 17. Feb 2005 Ort: Sankt Wendel 491 Beiträge Delphi 7 Professional |
#2
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 )
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;
Philipp F.
|
Zitat |
Registriert seit: 22. Okt 2007 Ort: Nähe Köln 1.063 Beiträge Delphi 7 Enterprise |
#3
Lad doch mal den gesamten Quelltext hoch, dann kann ich mal ausprobieren, ob der Fehler bei mir auch kommt und dir gegebenenfalls helfen.
Mfg
Robert L.
Der folgende Satz ist richtig! Der vorherige Satz ist falsch! Paradox |
Zitat |
Registriert seit: 18. Jan 2008 594 Beiträge |
#4
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;
Marco Tröger
|
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |