Custom Fill Pattern zu pixelig zum drucken

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo, ich muss noch mal was fragen.

ich möchte in einer graphicsView.Scene einige Rechtecke mit eigenen Schraffuren füllen.

Code: Alles auswählen

rect=QtGui.QGraphicsRectItem(0,0,30,30)
pix=QtGui.QPixmap('mypattern.png')
brush=QtGui.QBrush(pix)
rect.setBrush(brush)
Das funktioniert auch, aber nur, solange mypattern.png die gleich PIXEL-Auflösung hat, wie das rect, in diesem Falle 30x30. Was auf dem Bildschirm noch einigermaßen okay ist, sieht beim Ausdruck total pixelig aus.

Frage: Wie kriege ich eine größere .png-Datei komprimiert in ein kleines RectItem? Könnte ich alternativ das Koordinatensystem der Scene (und View) so verändern, dass ich eine feinere Auflösung habe und dann z.B. einfach mit einem RectItem 300x300 arbeite? Zu der Graphic gehört auch Text (QGraphicsSimpleTextItem). Wenn ich das Scene-Koordinatensystem verfeinern könnte, wird der Text dann noch lesbar dargestellt?


Vielen Dank!
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Wenn ich dich recht verstehe, willst du Rechtecke variabler Größe mit ein und dem selben QPixmap "füllen".

Ein Ansatz wäre, eine eigene Klasse für die SceneItems zu verwenden, bsp. eine die von QGraphicsRectItem erbt. Damit hast du das paint Event des Items verfügbar und kannst das Bild dort selbst zeichnen und entsprechend dein eigenes Tiling erzeugen.
Dabei spielt es keine Rolle ob das Bild größer oder kleiner als das Item.rect() ist.

Hase hat geschrieben:[...]Könnte ich alternativ das Koordinatensystem der Scene (und View) so verändern, dass ich eine feinere Auflösung habe[...]
Was meinst du denn damit? Ein Koordinatensystem lässt sich nicht "verfeinern" und dir steht doch sowieso der ganze reelle Zahlenbereich zur Verfügung. Du meinst eventuell die Auflösung für den Print, also die DPI. Es liegt ja an dir, in entsprechend großen Bildauflösungen zu arbeiten und das aus der QGraphicsScene generierte Bild später auf A4 Größe zu "pressen".
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo und vielen Dank für die Antwort.

Vielleicht habe ich mich nicht klar ausgedrückt, ich bitte um Entschuldigung.

Ich möchte Rechtecke mit eigenen Schraffuren erstellen. Das geht m.E. so, dass man sich eine eigene QBrush erstellt und diese mit einem QPixmap füllt.

Problem: Ein QRectF mit 30.0x30.0 Scene-Units lässt sich nur mit einem 30x30-Pixel-Pixmap richtig füllen. Ein 10x10-pixel Pixmap wird innerhalb des QRectF gekachelt, ein 50x50 pixel-Pixmap geht über den Rand des Rechtecks und wird abgeschnitten (clip).

Und wenn ich ein 30x30 Pixmap in gewisser Größe auf einem 600dpi-Drucker ausdrucke, sieht es eben pixelig aus.

Die Frage ist also: Wie bekomme ich statt des 30x30 Pixmap ein 300x300-(Pixel)-PNG Pixmap in ein 30.0x30.0 (Scene-Units) QRectF?
Ich lese überall, dass die Scene-Units unabhängig von Pixeln sind, sind sie aber offenbar nicht.
Was meinst du denn damit? Ein Koordinatensystem lässt sich nicht "verfeinern" und dir steht doch sowieso der ganze reelle Zahlenbereich zur Verfügung.
Ja, für QRectF schon, aber ein 30x30 QPixmap sind eben int(30) x int(30) Pixel.

Ich bräuchte sowas wie pix.width(Scene-Units), wobei das pixmap nur auf 30x30 gestaucht dargestellt wird.

pix.scaled(x,y) geht leider nicht, denn damit habe ich das gleiche Problem wie oben, da werden wirklich die Pixel unwiederbringlich reduziert.


Vielen Dank!
BlackJack

@Hase: Das ist offensichtlich kein Job für *Pixel*grafik.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Wenn deine Grafik nur in der Standard Screen Auflösung (wenn ich recht entsinne sind das 96 DPI) vorliegt, wird der Print auf A4+ natürlich matschig.
Du kannst also entweder mit Vektorgrafiken arbeiten oder wenn es denn rasterisierte Bilder sein müssen, in der Scene entsprechend mit großen Grafiken arbeiten. Dem User kannst du die Szene ja klein skaliert anzeigen, nur für das Speichern der ganzen Szene verwendest du dann die Originalgröße.

Womit druckst du das Bild denn? QPrinter? Wenn ja, ist der PrinterMode HighResolution vielleicht interessant.
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Dem User kannst du die Szene ja klein skaliert anzeigen, nur für das Speichern der ganzen Szene verwendest du dann die Originalgröße.
@Madmartigan
Das geht leider nicht, da auch Text in der Graphik ist, der dann auch klein skaliert wird und nicht mehr lesbar ist.

Das ist offensichtlich kein Job für *Pixel*grafik.
@BlackJack
Das war auch mein Gedanke. Nur ist es erforderlich, dass die Graphiken in eine Textverarbeitung eingefügt werden können.
Ich bin bei mir in der Firma der einzige mit Linux/LO, andere arbeiten mit Win/LO, die meisten mit Win/Word. Welches Vektorformat kann ich da nehmen? Ich habe schon viel mit MetaPost gemacht, geht sehr gut, aber eben nur mit LaTeX. SVG geht mit Word nicht, WMF ist ein einziger Misthaufen und geht nicht mit Qt. Die Pixelgraphiken sind halt der kleinste gemeinsame Nenner. Oder hat jemand eine bessere Idee?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Vielleicht EPS oder PDF? Schau doch mal bei einer Word-Installation nach. Ansonsten muss halt ein wenig durch die gegen konvertiert werden.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Hase hat geschrieben:
Dem User kannst du die Szene ja klein skaliert anzeigen, nur für das Speichern der ganzen Szene verwendest du dann die Originalgröße.
@Madmartigan
Das geht leider nicht, da auch Text in der Graphik ist, der dann auch klein skaliert wird und nicht mehr lesbar ist.
Das geht durchaus, man trennt einfach die Transformation der Grafiken von der Darstellung des Textes. Es verbietet dir doch niemand, ein transformiertes Rectangle zu zeichnen, den Text danach aber ohne die Transformation darzustellen. Sicher interessant: QPainter.push() und QPainter.restore()
Antworten