QPixmap draufzeichnen und direkt speichern

Verschiedenes zu Qt
Antworten
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

QPixmap draufzeichnen und direkt speichern

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Mal wieder ein 'klappt nicht' - Problem :roll:
QPainter::end() kommt zu spät und der Backslash ist hoffentlich so auch nicht im Code.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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'
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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]
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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"); 
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

AuE hat Folgendes geschrieben:
dann is der string zum speichern falsch....

Nein
stimmt ;-) habs auch getestet ;-)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

AuE hat geschrieben:hat Qt also ne eigene Slash "Dateinamen Syntax prüfung drin"?
Qt arbeitet intern nur mit '/' als Separator...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

3 Fragen:

Gibt es die Datei bei dir?
Wo rufst du auf?
Was gibt save zurück?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

@Qt-Nator: Posts überhaupt ansatzweise durchgelesen? Weder der ctor ist korrekt noch QPainter::end() vorhanden ... :roll:
@Aue: \n ist natürlich ein Linefeed - ist ja C
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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.
Antworten