Seite 1 von 1
QPixmap draufzeichnen und direkt speichern
Verfasst: 15. September 2008 13:50
von Qt-nator
Hi,
ich möchte in ein QPixmap direkt etwas zeichnen und es dannach wegspeichern nur leider klappt das speichern nicht so wies soll.
Ansatz:
Code: Alles auswählen
QPixmap pixmap;
QPainter painter(&pixmap);
painter.begin(&pixmap);
painter.setPen( QPen(Qt::blue,6));
painter.drawLine(10, 10, 200, 400);
pixmap.save("c:\pix.png", "png",10);
painter.end();
Wäre super wenn ihr mir da weiterhelfen könntet.
Gruß Qt-nator
Verfasst: 15. September 2008 15:00
von Christian81
Mal wieder ein 'klappt nicht' - Problem
QPainter::end() kommt zu spät und der Backslash ist hoffentlich so auch nicht im Code.
Verfasst: 15. September 2008 15:08
von Qt-nator
Ok das war ein nicht so toller ansatz hab einen neuen versuch:
Code: Alles auswählen
QImage imgMap;
imgMap.fill(qRgb(255,255,255));
for(int k = 1; k <= nXSize2Dim; k++)
{
for(int j = 1; j <= nXSize1Dim; j++)
{
double dX = Data->Xse.get(j,k);
double dY = Data->Yse.get(j,k);
imgMap.setPixel(dX,dY,qRgb(255,255,255));
}
}
imgMap.save("c:/MAP.bmp", "bmp",1);
Ich versteh nur nicht warum er nicht speichert.
Verfasst: 15. September 2008 15:18
von Christian81
Schonmal den Rückgabewert von QPixmap::save() überprüft? Der ist nämlich unter Garantie false. Es gibt laut
Doku (sigh!) kein Format namens 'bmp' - nur 'BMP'
Verfasst: 15. September 2008 15:21
von AuE
schau dir mal den Konstruktor an....
dann is der string zum speichern falsch....
mach dir doch einfach mal mit paint eine datei wie im code.... da zeichnest mit paint was rein. und dann kannst drauf gehen.
bei mir klappts so:
Code: Alles auswählen
QImage imgMap("c:\\MAP.bmp");
imgMap.fill(qRgb(255,255,255));
imgMap.save("c:\\MAP.bmp");
so wird z.b. ein komplett rotes bild wieder weiß
EDIT: format braucht man nicht zwingend angeben... er versuchts automatisch zu erkennen...
bool QImage::save ( const QString & fileName, const char * format = 0, int quality = -1 ) const
Saves the image to the file with the given fileName, using the given image file format and quality factor. If format is 0, QImage will attempt to guess the format by looking at fileName's suffix.
The quality factor must be in the range 0 to 100 or -1. Specify 0 to obtain small compressed files, 100 for large uncompressed files, and -1 (the default) to use the default settings.
Returns true if the image was successfully saved; otherwise returns false
[/quote]
Verfasst: 15. September 2008 15:27
von Christian81
AuE hat geschrieben:dann is der string zum speichern falsch....
Nein
EDIT: format braucht man nicht zwingend angeben... er versuchts automatisch zu erkennen...
Seit 4.2, ja
Verfasst: 15. September 2008 15:31
von AuE
hat Qt also ne eigene Slash "Dateinamen Syntax prüfung drin"?
meiner meinung ist c++ standard "\\" also im windoof (sorry.... ich klammere mich noch dran es so zu machen

)
war keine version angegeben... habe 441
by the way....
so gehts dann auch mitn linie zeichnen:
Code: Alles auswählen
Image imgMap("c:\\MAP.bmp");
QPainter painter(&imgMap);
painter.begin(&imgMap);
painter.setPen( QPen(Qt::blue,6));
painter.drawLine(10, 10, 200, 400);
imgMap.save("c:\\MAP.bmp");
Verfasst: 15. September 2008 15:35
von AuE
AuE hat Folgendes geschrieben:
dann is der string zum speichern falsch....
Nein
stimmt

habs auch getestet

Verfasst: 15. September 2008 15:36
von Christian81
AuE hat geschrieben:hat Qt also ne eigene Slash "Dateinamen Syntax prüfung drin"?
Qt arbeitet intern nur mit '/' als Separator...
Verfasst: 15. September 2008 15:39
von Qt-nator
hmm bei mir passiert nichts also vom speichern her.
Weder das:
Code: Alles auswählen
Image imgMap("c:\\MAP.bmp");
QPainter painter(&imgMap);
painter.begin(&imgMap);
painter.setPen( QPen(Qt::blue,6));
painter.drawLine(10, 10, 200, 400);
imgMap.save("c:\\MAP.bmp");
noch das:
Code: Alles auswählen
QImage imgMap("c:\\MAP.bmp");
imgMap.fill(qRgb(255,255,255));
for(int k = 1; k <= nXSize2Dim; k++)
{
for(int j = 1; j <= nXSize1Dim; j++)
{
double dX = Data->Xse.get(j,k);
double dY = Data->Yse.get(j,k);
imgMap.setPixel(dX,dY,qRgb(255,255,255));
}
}
imgMap.save("c:\\MAP.bmp","BMP",1);
geht. Ich möcht doch einfach nur ein neues Bild was reinzeichnen und es dann wegspeichern.
Warum klappt das nicht? Und bei euch anscheinend schon?
PS:
Wenn ich an der stelle mit den SetPixel bin dann kommt in der Konsole immer out of range. Wie kann ich das umgehn?
Verfasst: 15. September 2008 15:41
von AuE
dann muss er aber meine "\\" in "//" bzw "/" umwandeln...
aber wenn ich z.b. "C:\n.:" eingebe in nen QString... sieht er dann net en linefeed?
Verfasst: 15. September 2008 15:42
von AuE
3 Fragen:
Gibt es die Datei bei dir?
Wo rufst du auf?
Was gibt save zurück?
Verfasst: 15. September 2008 15:43
von Christian81
@Qt-Nator: Posts überhaupt ansatzweise durchgelesen? Weder der ctor ist korrekt noch QPainter::end() vorhanden ...
@Aue: \n ist natürlich ein Linefeed - ist ja C
Verfasst: 15. September 2008 15:46
von Qt-nator
Zu den Fragen:
1. Ja und Nein hab beides probiert aber im endeffekt möchte ich ja eine neue erstellen
2. In meiner Funktion
3. False
Sicher hab ich die durchgelesen und hab doch auch verbessert. Auserdem will ich gar kein Pixmap mehr sondern ein Image und möchte die Pixel einzeln setzen. Wo dann auch noch dieses out of Rage problem ist.
Verfasst: 15. September 2008 16:13
von AuE
EDIT: ab version 4.2 sollte es mit folgenden code gehen(vorrausgesetzt img existiert und das img hat eine Größe größer 0
Code: Alles auswählen
QImage imgMap("c://MAP.bmp");
if (imgMap.isNull()) return;
QPainter painter(&imgMap);
painter.begin(&imgMap);
painter.setPen( QPen(Qt::blue,6));
painter.drawLine(10, 10, 200, 400);
painter.end(); // kannst auch weglassen wenn dich im fkt scope befindest
imgMap.save("c://MAP.bmp");
painter->begin(0); // impossible - paint device cannot be 0
QPixmap image(0, 0);
painter->begin(&image); // impossible - image.isNull() == true;
painter->begin(myWidget);
painter2->begin(myWidget); // impossible - only one painter at a time
Note that most of the time, you can use one of the constructors instead of begin(), and that end() is automatically done at destruction.