1-bit Bitmap nach manipulation größer

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
lenny_hai
Beiträge: 12
Registriert: So 11. Dez 2022, 15:06

1-bit Bitmap nach manipulation größer

Beitrag von lenny_hai »

Moin zusammen,

ich weiß nicht wie ich das am Besten ausdrücken soll.
Wie einige mitbekommen haben, spiele ich mit einem Labelprinter rum. Der frist nur schwarz/weiß BMPs.
Also habe ich mir ein enprechend großes Bitmap im Gimp erstellt, lediglich mit einem Logo in schwarz drauf.
Das ganze habe ich als indexed 1-bit s/w abgespeichert.
Ich lade das ganze in ein Timage und anschließend lade ich es mittels der Druckersprache hoch und er druckt.
Soweit so gut. Sobald ich aber irgendetwas ändere z.B. mit Schwarz einen Buchstaben auf die Canvas schreibe, dann ist das Image danach nicht mehr schwarz/weiß iniziert.
Das lässt sich auch recht leicht erkennen, wenn man es einfach abspeichert und mit GIMP öffnet, mal abgesehen davon, dass es auch deutlich größer ist (in Bytes, nicht Pixel :-)) als vorher.
Ich habe schon versucht das PixelFormat auf 1-bit zu setzen (was es ja eigentlich schon gewesen sein müsste, da es ja ein solches Bild war), monochrom auf true, aber es ändert sich nichts daran.
Leider druckt er damit halt nicht mehr :-)

Gibt es einen einfachen Grund dafür oder stelle ich mich einfach nur dämlich an?


Viele Grüße Sven

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: 1-bit Bitmap nach manipulation größer

Beitrag von Winni »

Hi!

TImage passt sich den Gegebenheiten an. Da passiert Folgendes:

Wenn Du auf einen Canvas schreibst, ist das Antialiasing an.
Das heisst gegen unschöne harte Kanten werden einige Pixel an der Aussenseite in verschiedenen Grautönen gesetzt. Tmage "merkt" das und wandelt das sofort in 256er Grayscale um. Schon ist die Datei 8 Mal so groß. TImage führt ein "Eigenleben", das normalerweise recht komfortable ist. Hier nicht.

Setze Deine Versuche mal mit einer TBitmap fort. Das ist erfolgversprechender.

Wenn Du Deine Ergebnisse sehen willst, kannst Du die Bitmap auf ein TImage kopieren.

Wir hatten das Thema schon mal im Internationalen Forum, aber ich kann mich leider nicht an die Details erinnern.

Winni

Benutzeravatar
theo
Beiträge: 10878
Registriert: Mo 11. Sep 2006, 19:01

Re: 1-bit Bitmap nach manipulation größer

Beitrag von theo »

Die Standard Lazarus Grafik ist nicht so wirklich für so solche "Feinheiten" gemacht.
Wir hatten ein ähnliches Problem kürzlich hier:
viewtopic.php?f=18&t=14593

lenny_hai
Beiträge: 12
Registriert: So 11. Dez 2022, 15:06

Re: 1-bit Bitmap nach manipulation größer

Beitrag von lenny_hai »

theo hat geschrieben: Mi 4. Jan 2023, 20:03 Die Standard Lazarus Grafik ist nicht so wirklich für so solche "Feinheiten" gemacht.
Wir hatten ein ähnliches Problem kürzlich hier:
viewtopic.php?f=18&t=14593
Hi Theo,

aber eine wirkliche Lösung für 1-Bit ist da nicht wirklich zu finden??
Theoretisch soll der Drucker auch 8-Bit B/W Grafiken können, aber es funktioniert nicht (mit Gimp erstellt). Macht ja auch eigentlich kaum Sinn, da ein Thermotransferdrucker halt nur schwarz oder weiß kann, ein "bisschen vom Tranfserband ablösen" gibt es nicht ;-)

Viele Grüße Sven

Benutzeravatar
theo
Beiträge: 10878
Registriert: Mo 11. Sep 2006, 19:01

Re: 1-bit Bitmap nach manipulation größer

Beitrag von theo »

lenny_hai hat geschrieben: Mi 4. Jan 2023, 20:57 aber eine wirkliche Lösung für 1-Bit ist da nicht wirklich zu finden??
Wenn du das Beispiel hier in dem Zip nimmst und den Code in Unit1 auf 1bit änderst (s.unten), dann geht das schon.
Ob das für deinen Fall das Richtige ist, kann ich nicht beurteilen.
Der Code macht aus allem ein 1 Bit Bitmap, da brauchst du keine 1 Bit Vorlage von Gimp.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var Op:TOPBitmap;
  MS:TMemoryStream;
  Dec:TBmpDecoder;
  Enc:TBmpEncoder;
begin
  MS:=TMemoryStream.Create;
  Op:=TOPBitmap.Create;
  //Entweder so
  MS.LoadFromFile('test.bmp');
  //oder so, direkt vom Image1
  Image1.Picture.Bitmap.SaveToStream(MS);
  MS.Position:=0;   
  //
  Dec:=TBmpDecoder.Create;
  Dec.ReadImage(MS,OP);
  Dec.Free;
  Ms.Clear;
  Op.PixelFormat:=pf1bit;
  Enc:=TBmpEncoder.Create;
  Enc.BitsPerPixel:=1;
  Enc.RLECompress:=false;
  Enc.WriteImage(MS,Op);
  Ms.SaveToFile('test1.bmp');
  Enc.Free;
  Op.free;
  MS.Free;
end;   

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: 1-bit Bitmap nach manipulation größer

Beitrag von Winni »

Hi!

User Lainz hat im Internationalen Forum das Problem mit der BGRAbitmap gelöst:

https://forum.lazarus.freepascal.org/in ... msg344159

Winni

lenny_hai
Beiträge: 12
Registriert: So 11. Dez 2022, 15:06

Re: 1-bit Bitmap nach manipulation größer

Beitrag von lenny_hai »

Moin zusammen,

erstmal vielen Dank, ich versuche mal die Ergebnisse zusammen zu bekommen....

Winni hat geschrieben: Mi 4. Jan 2023, 19:56 Setze Deine Versuche mal mit einer TBitmap fort. Das ist erfolgversprechender.
Das bringt leider keinen Unterschied.
Winni hat geschrieben: Do 5. Jan 2023, 14:15 User Lainz hat im Internationalen Forum das Problem mit der BGRAbitmap gelöst:
Habe ich mir angeschaut und scheiter an dem verwendeten TBitmapData, dass gibt es bei Lazarus unter Linux scheinbar nicht. Habe zwar etwas ähnliches gefunden (BitmapPixels), ist aber leider nicht kompatibel
theo hat geschrieben: Mi 4. Jan 2023, 21:38 Wenn du das Beispiel hier in dem Zip nimmst und den Code in Unit1 auf 1bit änderst (s.unten), dann geht das schon.
Ob das für deinen Fall das Richtige ist, kann ich nicht beurteilen.
Der Code macht aus allem ein 1 Bit Bitmap, da brauchst du keine 1 Bit Vorlage von Gimp.
Das funktioniert..... es funktioniert :mrgreen: :mrgreen: :mrgreen: Ich falle vom Glauben ab, was für ein Aufwand mit diesem ganzen Canvas Kram.


Vielen Dank und viele Grüße Sven

Antworten