Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Bild wird negativ gedruckt (https://www.delphipraxis.net/116172-bild-wird-negativ-gedruckt.html)

Moony 24. Jun 2008 16:36


Bild wird negativ gedruckt
 
Hallo zusammen,

ich hab da so ein Phänomen:

In meiner Anwendung schicke ich unter anderem Bilder an den Drucker. Neuerdings habe ich auch runde Ecken bei Bildern eingebaut. Das Phänomen ist, dass ich einen Drucker habe bei dem Die Bilder, sobald ich die runden Ecken einstelle, als Negativ gedruckt werden. Mit eckigen Ecken normal. Habe das dann an 3 anderen Druckern von unterschiedlichen Herstellern probiert und die machen das richtig.

Wie kann ich diesem Problem auf die Schliche kommen?

Danke & Gruß, Moony

Bernhard Geyer 24. Jun 2008 16:38

Re: Bild wird negativ gedruckt
 
Wie druckst du die Dateien (Quellcode)? Sind es evtl. TIFF-Dateien?

Moony 24. Jun 2008 16:44

Re: Bild wird negativ gedruckt
 
Das sind ganz normale jpg bilder mit 24 bit. Ich schicke es mit

Printer.Canvas.StretchDraw(myRect, myGraphic);

an den Drucker. Das myGraphic ist bereits mit den runden Ecken. Ich habe mal eine Drucksimulation, bei der das Bild, welches an den Drucker geschickt wird als Bilddatei gespeichert wird. Diese Datei ist vollkommen in Ordnung. Wenn ich das aber an den Drucker schicke, sind die Bilder mit den runden Ecken als negativ ausgedruckt.

SirThornberry 24. Jun 2008 17:44

Re: Bild wird negativ gedruckt
 
was verstehst du unter negativ? Sind die farben anders oder ist das Bild geflippt?
Unabhängig davon liegt es an Stretchdraw. Nicht alle Druckertreiber unterstützen die volle funktionalität.

Yellow579 24. Jun 2008 18:13

Re: Bild wird negativ gedruckt
 
Problem:
Zitat:

Zitat von SirThornberry
Unabhängig davon liegt es an Stretchdraw. Nicht alle Druckertreiber unterstützen die volle funktionalität.

Lösung: z.B.: hier

Moony 25. Jun 2008 07:46

Re: Bild wird negativ gedruckt
 
Unter negativ verstehe ich, dass das Bild als Negativ gedruckt wird. Sprich alle Farben werden invertiert ausgedruckt.

Ich werde die Funktion ausprobieren und melde mich hier wieder. Danke.

Nachtrag:

Folgendes Zwischenergebnis:

1. Wenn ich die genannte "PrintBitmap" Routine verwende, dann werden meine abgerundeten Ecken in Rosa gefärbt.
2. Wenn ich dann auf drucken gehe, wird das Bild richtig gedruckt, aber mit rosa Ecken.

Das Bild wird vorher folgendermaßen mit den Runden Ecken gesetzt:

Delphi-Quellcode:
procedure DoItRound(var myImage: TImage; pixels: Integer);
var bmp_mask,
    bmp_tmp  : TBitmap;

const cl_trans_tmp = clWhite;
      cl_trans    = clFuchsia;
begin
  bmp_mask := TBitmap.create;
  bmp_tmp := TBitmap.create;
  try
    //load bitmap
    bmp_tmp.Assign(myImage.picture.bitmap);

    //resize mask
    bmp_mask.PixelFormat := pf24bit;
    bmp_tmp.PixelFormat := pf24bit;
    bmp_mask.width := myImage.picture.bitmap.width;
    bmp_mask.height := myImage.picture.bitmap.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.RoundRect(0,0,bmp_mask.width,bmp_mask.height, pixels,pixels);
    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
   BitBlt(myImage.Canvas.Handle, 0, 0, myImage.picture.bitmap.width, myImage.picture.bitmap.height, bmp_tmp.canvas.Handle, 0, 0, srcCopy);
    myImage.canvas.draw(0,0,bmp_tmp);
    myImage.Picture.Bitmap.TransparentColor := cl_trans;
    myImage.Transparent     := true;
  finally
    //free Objects
    bmp_tmp.free;
    bmp_mask.free;
  end;
end;
Wie gesagt. Die Routine funktioniert an sich sehr gut, um die runden Ecken in die Bilder zu bekommen. Nur der eine Drucker wehrt sich dagegen. Wenn ich die StrechDraw anwende, werden die Ecken transparent gezeichnet, aber das Bild als Negativ gedruckt. Verwende ich die genannte PrintBitmap Routine, dann wird das Bild richtig gedruckt, die Ecken aber rosa gezeichnet. Was ein Teufelskreis......!!!! :wall:

Ich hoffe nur, dass es da einen Ausweg gibt...

Gruß, Moony

[edit=SirThornberry]Beiträge zusammengeführt - nächstes mal bitte die Edit-Funktion verwenden - Mfg, SirThornberry[/edit]
[edit=sakura] Zeilenumbrüche ermöglicht... Mfg, sakura[/edit]

SirThornberry 25. Jun 2008 10:05

Re: Bild wird negativ gedruckt
 
Das wird wohl dran liegen das Stretchdraw einfach dein Rosa als Transparent interpretiert.
Ist an der Stelle wo du diese "runden ecken" :roll: hast auf dem Blatt dann was anderes zu sehen? Wenn nicht könntest du diese einfach weiß einfärben.
Oder bringst eben erst dein Bild auf die Canvas und malst anschließend was drüber an den stellen wo die weißen ecken dann sind (weiß wird ja nicht mit gedruckt)

Ich habe ein wenig den Eindruck das du deine eigene Funktion nicht verstehst.

Zur Zeit erstellst du dort ein Bild welches in den Ecken Rosa Rundungen hat und in der Mitte weiß ist. Dieses Bild malst du dann über dein aktuelles unter Berücksichtigung dessen das weiß als Transparent gewertet werden soll und somit das weiß nicht mit aufs Bild kopiert wird.
Als Resultat kommt dabei ein Bild heraus was aus deinem ursprünglichem Bild besteht mit Rosa Rundungen in den Ecken.

Wenn dich jetzt dieses Rosa stört wäre es doch das einfachste einfach anstelle von Rosa, die Farbe zu nehmen die du haben willst.

Yellow579 25. Jun 2008 10:11

Re: Bild wird negativ gedruckt
 
Hallo Moony!

Du verwendest bzw. nutzt die Transparent Eigenschaft von TBitmap aus und da liegt das Problem. Delphi-Referenz durchsuchenTransparent, Delphi-Referenz durchsuchenTransparentMode und Delphi-Referenz durchsuchenTransparentColor werden von der VCL angeboten und diese implementiert alle Routinen so, dass sie diese Eigenschaft interpretiert und entsprechend umsetzt. Auf der WinAPI Ebene gibt es diese Eigenschaft nicht, dort musst du eigentlich per Hand mit Masken arbeiten und alle nicht transparenten Teile auf dein Ziel malen lassen.

Problem: MSDN-Library durchsuchenBitBlt() und andere WinAPI kennen keine TransparentColor und malen somit diese mit. Deine Rosa-Farbe ist deine TransparentColor und wird somit mit ausgegeben.

Lösung: Erzeuge dir einen DC mit dem Ergebnisbild, also mit schon umgesetzter Transparenz. Dies erreichst du z.B. in dem du ein TBitmap anlegst und darauf mit Draw() einmal das Bild mit der Transparenzangabe raufzeichnen lässt. Da die Standardfarbe von einem TBitmap (bzw. DC) weiß ist, werden deine Ecken weiß sein, was der Papierfarbe entsprechend sollte. Somit würde das Ausdrucken ein rundes Bild mit weißen Ecken erzeugen.

Zur Kontrolle lege dir ein TImage auf dein Formular und weise mit Assign() dein endgültiges Bild vor dem Ausdrucken zu. Das TImage sollte das richtige Bild anzeigen - Voraussetzung ist dabei aber auch, dass die Transparent Eigenschaft von dem zugewiesenen TBitmap und vom anzeigenden TImage false sind.

Gruss,
Yellow

Moony 25. Jun 2008 10:50

Re: Bild wird negativ gedruckt
 
@SirThornberry:
Ich kann nicht einfach sagen, dass ich weiß nehme statt "rosa", weil ich nicht weiß was hinter dem Bild für eine Farbe besteht. Das kann jederzeit variieren.
Davon abgesehen werden die rosa Ecken erst gezeichnet, wenn ich die PrintBitmap Routine verwende.

@Yellow:
Das ist ja alles gut, WENN ich einen weißen Hintergrund habe. Da ich aber nicht weiß ob und welche Farbe hinter dem Bild erstellt wird, kann ich keine weißen Ecken zeichnen, sondern transparent.

Wie gesagt, das Zeichnen der transparenten Ecken funktioniert auf allen anderen Druckern mit der oben genannten Routine. Wenn ich jedoch mit PrintBitmap es versuche zu zeichnen, wird das Bild richtig gedruckt, aber mit rosa Ecken.

Ich MUSS wegen des wechselnden Hintergrunds transparente Ecken zeichnen.

Yellow579 25. Jun 2008 11:20

Re: Bild wird negativ gedruckt
 
Hallo Moony!

Zitat:

Zitat von Moony
Das ist ja alles gut, WENN ich einen weißen Hintergrund habe. Da ich aber nicht weiß ob und welche Farbe hinter dem Bild erstellt wird, kann ich keine weißen Ecken zeichnen, sondern transparent.

Du verstehst nicht, wie Transparenz arbeitet. Und von daher verstehst du meinen Lösungsansatz nicht.

Und wenn sich dein Hintergrund ändert, dann male zuvor auf das neue Bitmap dein sich wechselnden Hintergrund auf und dann mit Draw() oder StretchDraw() dein rundes Bild. Ergebnis: siehe letzten Absatz.

Zitat:

Zitat von Moony
Wie gesagt, das Zeichnen der transparenten Ecken funktioniert auf allen anderen Druckern mit der oben genannten Routine.

Nimm einen einfachen Drucker und es klappt nicht. Das hängt vollkommen vom GDI Befehlsatz des Druckertreibers ab.

Zitat:

Zitat von Moony
Wenn ich jedoch mit PrintBitmap es versuche zu zeichnen, wird das Bild richtig gedruckt, aber mit rosa Ecken.

Weil er Transparent nicht kennt und somit ganz normal zeichnet. Und wenn du rosa als Transparenzfarbe nimmst und die in die Ecken malst, malt er es so wieder, da er nichts weiss um die Besonderheit dieser Farbe.

Zitat:

Zitat von Moony
Ich MUSS wegen des wechselnden Hintergrunds transparente Ecken zeichnen.

Dann mal mit Draw() oder Stretchdraw dieses Bild auf das Bild mit dem wechselnden Inhalt. Im Endeffekt hast du dann ein Bild ohne benutzte Transparenz, da die Transparenz beim Draw() entsprechend umgesetzt wurde.

Gruss
Yellow


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:16 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