Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi warum sind .bmp sooo viel größer als Jpeg? (https://www.delphipraxis.net/112137-warum-sind-bmp-sooo-viel-groesser-als-jpeg.html)

Spiderpig_GER_15 15. Apr 2008 16:55


warum sind .bmp sooo viel größer als Jpeg?
 
Hi,

ich habe eine Frage, warum ist ein Bild, das im Jpeg Format 1,4 MB groß ist
im .bmp 21MB groß?

Und warum brauch man ausgerechnet .bmp wenn man mit canvas da eine ellipse drüber malen möchte? :wall: :twisted:

MfG
Spiderpig

Namenloser 15. Apr 2008 16:58

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Was willst du jetzt für ne Antwort hören? Weil JPEG im Gegensatz zu BMP komprimiert.
Du kannst übrigens ohne Probleme eine Datei als JPEG in ein Bitmap laden, darauf herumzeichnen und anschließend wieder als .jpg speichern.

Muetze1 15. Apr 2008 17:00

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Zitat:

Zitat von NamenLozer
Was willst du jetzt für ne Antwort hören? Weil JPEG im Gegensatz zu BMP komprimiert.

Bitmap komprimiert auch: RLE, aber die ist bei weitem nicht so effizient, aber dafür lossless.

Zitat:

Zitat von NamenLozer
Du kannst übrigens ohne Probleme eine Datei als JPEG in ein Bitmap laden, darauf herumzeichnen und anschließend wieder als .jpg speichern.

Was aber intern wieder zum Auspacken führt und dann zum erneuten komprimieren.

gmc616 15. Apr 2008 17:03

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Weil JPG ein verlustbehaftetes Komprimierformat ist und BMP nicht.

Im BMP werden Pixel im 32Bit-Moduls durch 3 Bytes definiert, jeweils eins für Rot,Grün und Blau.
Im Jpg werden mehrere Pixel zusammen zu Einem gefasst. Zusätzlich kommt noch eine Komprimierung drüber.

Wenn du ein BMP zu einem JPG wandelst und vergleichender Weise in das Bild hinein zoomst, sieht du den Unterschied.

Spiderpig_GER_15 15. Apr 2008 17:05

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Heißt das ich kann in ein Image ein Jpeg laden, und da mit canvas drüber malen?
Bei mir kommt da ne Fehlermeldung :'Kann nur bei Bitmap verändert werden...'

Kann mir jemand erklären wie das geht?

MfG
Spiderpig

PS @ gmc Das dämliche ist, ich habe ein Jpeg, und wandle das in ein Bitmap um... und leider nicht andersrum

Neutral General 15. Apr 2008 17:08

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Hi,

Ja du musst das JPEG erst in ein TBitmap laden und kannst dann im Bitmap draufrummalen und das kannst du dann entweder ins TImage laden oder in ein JPEG umwandeln und dann ins Image laden.

Gruß
Neutral General

Spiderpig_GER_15 15. Apr 2008 17:09

Re: warum sind .bmp sooo viel größer als Jpeg?
 
wie kann ich etwas in ein Tbitmap laden?

Neutral General 15. Apr 2008 17:31

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Hi,

Delphi-Quellcode:
function JPEGToBMP(JPEG: TGraphic): TBitmap;
begin
  if JPEG.ClassType <> TJPEGImage then
    exit;
  Result := TBitmap.Create;
  Result.Assign(JPEG);
end;

// JPEG aus Image1 als Bitmap ins Image2 kopieren.
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image2.Picture.Bitmap := JPEGToBMP(Image1.Picture.Graphic);
end;
Gruß
Neutral General

Spiderpig_GER_15 15. Apr 2008 17:39

Re: warum sind .bmp sooo viel größer als Jpeg?
 
ohoh ich bin zu doof um das zu verstehen, habs aber versucht.
Kann man nicht einfach wie bei shapes ein image auf rund stellen?
Oder einfach ein bild in ein shape laden?

SirThornberry 15. Apr 2008 17:53

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Zitat:

Zitat von Neutral General
Hi,

Delphi-Quellcode:
function JPEGToBMP(JPEG: TGraphic): TBitmap;
begin
  if JPEG.ClassType <> TJPEGImage then
    exit;
  Result := TBitmap.Create;
  Result.Assign(JPEG);
end;

// JPEG aus Image1 als Bitmap ins Image2 kopieren.
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image2.Picture.Bitmap := JPEGToBMP(Image1.Picture.Graphic);
end;
Gruß
Neutral General

Haben wir dadurch nicht ein Speicherleck? ;-) Denn intern wird beim zuweisen des Bitmaps dieses kopiert. Dadurch wird nirgends die Instanz welche deine Funktion zurück gibt gehalten und wird somit auch nirgends frei gegeben.


Zum eigentlichen Thema. Auf einem JPEG kannst du aus dem gleichen Grund nicht malen warum du auch auf einem zusammengeknüllten Blatt papier nicht malen kannst. Wenn du es auseinander faltest kannst du überall hübsch rum malen und anschließend kannst du es auch wieder zusammen knüllen.

Neutral General 15. Apr 2008 18:07

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Echt ? Wird das komplette Bitmap kopiert? Hab mich als ich das zusammengeschrieben habe auch kurz gefragt obs en Speicherleck gibt, aber da dachte ich:

Ich weise den Pointer auf das Bitmap ja dem Image.Picture.Bitmap zu und das wird ja freigegeben wenn das Image freigegeben wird.

Falsch gedacht?

SirThornberry 15. Apr 2008 18:12

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Delphi-Quellcode:
TPicture = class(....)
[...]
  property Bitmap: TBitmap read GetBitmap write SetBitmap;
[...]

procedure TPicture.SetBitmap(Value: TBitmap);
begin
  SetGraphic(Value);
end;

procedure TPicture.SetGraphic(Value: TGraphic);
var
  NewGraphic: TGraphic;
begin
  NewGraphic := nil;
  if Value <> nil then
  begin
    NewGraphic := TGraphicClass(Value.ClassType).Create;
    NewGraphic.Assign(Value); //<=== Tada, es wird kopiert :-)
[...]

Namenloser 15. Apr 2008 18:25

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von NamenLozer
Du kannst übrigens ohne Probleme eine Datei als JPEG in ein Bitmap laden, darauf herumzeichnen und anschließend wieder als .jpg speichern.

Was aber intern wieder zum Auspacken führt und dann zum erneuten komprimieren.

Hab ich was anderes behauptet? :gruebel: Intern dürfte die Grafik wahrscheinlich eh als Bitmap vorliegen. (Bzw Canvas, das aber vom Speicherverbrauch her identisch sein sollte).

Zitat:

Zitat von Muetze1
Zitat:

Zitat von NamenLozer
Was willst du jetzt für ne Antwort hören? Weil JPEG im Gegensatz zu BMP komprimiert.

Bitmap komprimiert auch: RLE, aber die ist bei weitem nicht so effizient, aber dafür lossless.

Die RLE-Komprimierung kann man aber echt vergessen. Dann schon lieber GIF, oder noch besser: PNG.

DMW 15. Apr 2008 18:42

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Zitat:

Zitat von Muetze1
Bitmap komprimiert auch: RLE, aber die ist bei weitem nicht so effizient, aber dafür lossless.

Das ist nur bei Bitmaps mit 4 oder 8 bpp möglich.
Eine ordentliche verlustfreie Kompression für Bitmaps bietet das PNG-Format. Für Photos eignet sich das allerdings nicht.

Nuclear-Ping 16. Apr 2008 11:31

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Zitat:

Zitat von Spiderpig_GER_15
wie kann ich etwas in ein Tbitmap laden?

Delphi-Quellcode:
uses ..., JPEG, ...
var
  jpg: TJPEG;
  bmp: TBitmap;
begin
  jpg := TJPEG.Create;
  bmp := TBitmap.Create;
  try
    jpg.LoadFromFile ('C:\irgendeine.jpg');
    bmp.Assign (jpg); // <<- JPG dem BMP zuweisen
    bmp.SaveToFile ('C:\irgendeine.bmp');
  finally
    FreeAndNil (bmp);
    FreeAndNil (jpg);
  end;
end;
Funktioniert andersrum auch. Also bmp.LoadFromFile, Jpg.Assign, Jpg.SaveToFile ...

mimi 16. Apr 2008 14:41

Re: warum sind .bmp sooo viel größer als Jpeg?
 
@Spiderpig_GER_15
Wenn du ein Bild "Rund" da stellen möchtest solltest du die Eigenschaft Tranzparent von TImage auf true stellen und bei
TranparentColor eine Farbe zuweisen.

Spiderpig_GER_15 17. Apr 2008 12:14

Re: warum sind .bmp sooo viel größer als Jpeg?
 
@mimi, aber davon wird mein Bild auch nicht 'runder' oder? Wo ist eignetlich der unterschied wenn ich das Bild auf transperent stelle?

@Nuclear Ping vieeelen dank, genau das war meine Frage thx

Thx
:-D
Spiderpig

_frank_ 17. Apr 2008 12:18

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Zitat:

Zitat von Spiderpig_GER_15
@mimi, aber davon wird mein Bild auch nicht 'runder' oder? Wo ist eignetlich der unterschied wenn ich das Bild auf transperent stelle?

du must natürlich dein bild an den stellen mit der Transparent-Farbe übermalen, wo es transparent werden soll :) also eine Elipse und alles was zwischen der und dem Rand des Bitmaps ist...

Gruß Frank

mimi 17. Apr 2008 13:24

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Naja, es stimmt schon, rund wird das Viereck dadurch nicht, aber es sieht so aus der Anwender wird davon nix mitbekommen.

Alles was der Transparent Farbe entspricht wird mit dem Hintergrund Übermalt.

_frank_ 17. Apr 2008 14:07

Re: warum sind .bmp sooo viel größer als Jpeg?
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich hab da mal was zusammengeschrieben...einfach ein TImage aufs form, ein bitmap reinladen und folgende Methode mit einbauen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var bmp_mask,bmp_tmp:TBitmap;
const cl_trans_tmp=clWhite;
      cl_trans=clFuchsia;
begin
  bmp_mask:=TBitmap.create;
  bmp_tmp:=TBitmap.create;
  //load bitmap
  bmp_tmp.Assign(image1.picture.bitmap);
  //resize mask
  bmp_mask.width:=bmp_tmp.width;
  bmp_mask.height:=bmp_tmp.height;
  //create the mask;
  bmp_mask.canvas.brush.color:=cl_trans;
  bmp_mask.canvas.Pen.color:=cl_trans;
  bmp_mask.Canvas.FillRect(rect(0,0,bmp_mask.width,bmp_mask.height));
  bmp_mask.canvas.brush.color:=cl_trans_tmp;
  bmp_mask.canvas.Pen.color:=cl_trans_tmp;
  bmp_mask.canvas.ellipse(0,0,bmp_mask.width,bmp_mask.height);
  bmp_mask.TransparentColor:=cl_trans_tmp;
  bmp_mask.Transparent:=true;
  //merging the mask with original bitmap
  bmp_tmp.Canvas.Draw(0,0,bmp_mask);
  bmp_tmp.TransparentColor:=cl_trans;
  bmp_tmp.Transparent:=true;
  //Draw masked bitmap
  canvas.draw(0,0,bmp_tmp);
  //free Objects
  bmp_tmp.free;
  bmp_mask.free;
end;
Gruß Frank

Spiderpig_GER_15 19. Apr 2008 23:06

Re: warum sind .bmp sooo viel größer als Jpeg?
 
omg, dann ist das ja garnicht soo kompliziert!
Thx, hab kapiert wie das funktioniert, und hilft mir extrem weiter!

PS eine frage noch, geht das auch mit jpeg?
Ich habe nämlich ein jpeg bild das riesig ist(3200*2400), welches ich als hintergrund verwenden möchte, und das wäre als bmp 21 Mb gross (statt 2 Mb) und damit kommt delphi nicht mehr zurecht...

MfG

Spiderpig

_frank_ 20. Apr 2008 03:35

Re: warum sind .bmp sooo viel größer als Jpeg?
 
wenn du dir mal ein Jpeg vergrößert anschaust, wirst du sehen, dass selbst Bereiche die einfarbig erscheinen, sich aus mehreren Farben zusammensetzen und du somit kein Jpeg als Maske verwenden kannst. Das Bild (bei mir im TImage) kannst du schon als jpg laden, aber es muss trotzdem von delphi in TBitmap konvertiert werden, um auf das Canvas zugreifen zu können. Für die Maske selbst reicht aber ein 1Bit-Bitmap (schwarz/weis=>pf1Bit), welches deutlich kleiner ist.

warum hast du so ein großes bild? was hast du damit vor? als Hintergrundbild (was hast du für nen Monitor??)?. evtl. musst du es teilen, was natürlich die sache mit der Maske bisschen komplizierter macht.

evtl. kannst du mit der Graphics32-unit größere bitmaps laden, aber hab damit selbst noch nichts gemacht...kann also sein, dass die Maskengeschichte damit anders funktioniert ;)

HTH Frank

Spiderpig_GER_15 20. Apr 2008 10:16

Re: warum sind .bmp sooo viel größer als Jpeg?
 
also ist die maske in der vorderen ebene oder im hintergrund?

ich will ja nur im Hintergrund ein jpg bild nehmen.
Im vordergrund brauch ich einfach nur eine schwarze fläache die
ein loch in der mitte hat.

MfG

Spiderpig

_frank_ 20. Apr 2008 11:39

Re: warum sind .bmp sooo viel größer als Jpeg?
 
wie in meinem Beispiel zu sehen ist die maske im vordergrund und färbt den Bereich des "hintergrundes" in einer Farbe ein, die später transparent werden soll...letzteres ist richtig, jedoch muss halt das jpg in deinem Programm auch in TBitmap gewandelt werden, wo du evtl. an die selben Grenzen stöst.

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.

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