QImage::scaled

Alles rund um die Programmierung mit Qt
Antworten
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

QImage::scaled

Beitrag von pospiech »

Ich habe Bilder in der Größe 256 die auf 768 vergrößert werden.
Damit haben diese genau den Faktor 3. Ich möchte auch das im Endbild die Struktur exakt die gleiche ist wie im Originalbild, also jeweils 9 Pixel mit derselben Farbe.

Wenn ich nun hochskalieren mit
Qt::FastTransformation oder
Qt::SmoothTransformation

dann hat das 768er Bild jeden Pixel eine andere Farbe, nur dass bei Fast das ganze sehr Pixelig ist, und bei Smooth sehr verwaschen.

Gibt es eine Möglichkeit unverändert hochzuskalieren sofern die Faktoren passen und nur bei nichtganzahligen Faktoren eine Umrechnung vorzuhmen?

Matthias
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was du eigentlich suchst ist eine Skalierung einer Vektor-Grafik und keiner Pixel-Grafik. Du könntest dir also überlegen, wie du deine Pixel-Grafik vektorisieren lassen kannst.
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

Beitrag von pospiech »

upsala hat geschrieben:Was du eigentlich suchst ist eine Skalierung einer Vektor-Grafik und keiner Pixel-Grafik. Du könntest dir also überlegen, wie du deine Pixel-Grafik vektorisieren lassen kannst.
Was ich brauche ist eine 'schnelle' Konvertierung. Ein Bitmap zu vektorisieren scheint mir nicht schnell zu sein. Ich könnte diese Konvertierung natürlich über For schleifen vornehmen und die Transformation selber erledigen, aber das scheint mir überhaupt nicht schnell zu sein.

Im Grund will ich ja nichts anders, als aus

12
34

ein
111222
111222
111222
333444
333444
333444

zu machen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du möchtest ein spezielles Verfahren zum Skalieren - das bietet Qt nicht (zumindest nicht in genau der Art wie Du es willst), also musst Du es selbst machen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

pospiech hat geschrieben:Was ich brauche ist eine 'schnelle' Konvertierung.
Was Du suchst ist ein vergrößern, kein skalieren.
pospiech hat geschrieben:Ich könnte diese Konvertierung natürlich über For schleifen vornehmen und die Transformation selber erledigen, aber das scheint mir überhaupt nicht schnell zu sein.
Warum nicht? Beim skalieren wird jedes Pixel neu berechnet, je nach Algorithmus abhängig von umliegenden Pixeln, usw. Beim vergößern erhöhst du nur die Anzahl der Pixel, rechnest aber nicht an jedem rum. Wenn man es vernünftig macht, dann ist es auch schnell.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

Beitrag von pospiech »

macman hat geschrieben:Wenn man es vernünftig macht, dann ist es auch schnell.
Ich arbeite daran, aber mein Code lösst im Moment nur eine Assertion aus, sobald der Scope der Äußeren for Schleife verlassen wird, und ich verstehe nicht warum:

Code: Alles auswählen

void widgetComplexBeamView::rescaleImage(QImage * image)
{
	double divider = m_ViewSize.width()/image->width();
	if (((int)divider == divider) && divider > 1)
	{
		m_scaledImage = QImage(m_ViewSize.width(), m_ViewSize.height(), QImage::Format_RGB32);			
		int y_scaled = 0;
		int divider_x = (int)divider;
		int divider_y = (int)divider;
		for ( int y = 0; y < image->height(); y++ ) 
		{
			QRgb *line = (QRgb *)image->scanLine(y) ;
			for (int multy = 0; multy < divider_y; multy++)
			{
				y_scaled++;
				QRgb *linescaled = (QRgb *)m_scaledImage.scanLine(y_scaled) ;				
				for ( int x = 0; x < image->width(); x++ )
				{
					QRgb color = *line++;
					for (int multx = 0; multx < divider_x; multx++)
					{
						*linescaled++ = color;
						//qDebug() << y << y_scaled << x;
					}
				}
			}
		}
	}
	else
	{
		m_scaledImage = image->scaled(m_ViewSize.width(), m_ViewSize.height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); //Qt::FastTransformation
	}
}
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

pospiech hat geschrieben:Ich arbeite daran, aber mein Code lösst im Moment nur eine Assertion aus, sobald der Scope der Äußeren for Schleife verlassen wird, und ich verstehe nicht warum:
Na dann wird es Zeit Funktionsweise und Bedienung eine Debuggers zu erlernen :-)
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

Beitrag von pospiech »

macman hat geschrieben:
pospiech hat geschrieben:Ich arbeite daran, aber mein Code lösst im Moment nur eine Assertion aus, sobald der Scope der Äußeren for Schleife verlassen wird, und ich verstehe nicht warum:
Na dann wird es Zeit Funktionsweise und Bedienung eine Debuggers zu erlernen :-)
Haha!

Die Schleife läuft komplett durch, was ich anhand des qDebug sehen kann. Wenn ich nun aber eine Breakpoint auf das else setzte ist es schon abgestürzt. Das Assert taucht im Qt Quellcode auf, wo er keinen entsprechenden Quellcode zu anzueigen kann.

Wie soll ich das nun Debuggen?

Matthias
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dieses Forum ist nicht dazu, um zu erklären, wie man einen Debugger bedient. Da dir aber anscheinend nicht einmal die Funktionsweise deines Programmes bekannt ist, empfehle ich dir den Einzelschrittbetrieb im Debugger. Die Bedienungsanleitung des von dir verwendeten Debuggers hilft dir hier sicher weiter.
Antworten