GDI+ Bitmap Problem

paddy3k

Mitglied
Hallo! :)

bin neu hier und habe ein großes (kleines?) Problem. Ich möchte in einer Dialogfeldbasierten MFC C++ Anwendung, mithilfe der GDI+ Objekte vom Typ
Bitmap dynamisch erzeugen. Und zwar beliebig viele, da erst zur Laufzeit
feststeht wieviele Objekte ich davon brauch. Hier mal ein Codeschnipsel:

Bitmap bitmap(L"h2o_hund.jpg");
Bitmap* clone = bitmap.Clone(Rect(0, 0, CntX, CntY), PixelFormatDontCare);
g.DrawImage(clone, 0, 0, 210, 252);

Bitmap *bmp;
bmp = new Bitmap();

die oberen 3 Zeilen klappen wunderbar, er kopiert einen Teil aus dem Bild und zeigts
an. Im unteren Teil bekomm ich immer den Fehler das es kein Standartkonstruktor gibt.

Wie lege ich jetzt Bitmap Objekte dynamisch an Oder habe ich nur ein Syntaxproblem ?!

bmp = new Bitmap(0, 0) z.B. geht auch nicht

Würde mich riesig freuen wenn mir jemand helfen kann :)
 
Ich habe gerade nochwas auf den MSDN Seiten gefunden, ein Codeschnipsel :

// C++
Bitmap * myBitmap = new
Bitmap(S"D:\\Documents and Settings\\Joe\\Pics\\myPic.bmp");

die machens also auch so. Übernehme ich das so in mein Programm bekomme ich den Fehler :

"fatal error C1190: Verwalteter abzielender Code erfordert '#using <mscorlib.dll>' und den '/CLR'-Schalter"

ändere ich das S zu Bitmap(L"...") kommt folgendes :

error C2660: 'Gdiplus::GdiplusBase::eek:perator new': Funktion akzeptiert keine 3 Argumente

error C2512: 'Gdiplus::Bitmap': Kein geeigneter Standardkonstruktor verfügbar


komischerweise funktioniert es so wunderbar unter der WinAPI, also ohne MFC.
Wie bekomme ich das jetzt nur mit den MFC zum laufen
 
Würde dir empfehlen die CPicture Klasse zu nutzen, damit haste keine Probleme...

Ich habe selbst mal ein wenig versucht mit Grafiken in MFC zu basteln, und habe festgestellt, das die Klassen dafür einfach nicht ausgereift genug sind. Mit der CPicture Klasse ist das alles kein Problem gewesen...

Wenn du das mal testen möchtest, such im Forum einfach mal nach "Bilder" oder schau meine Posts nach, irgendwo habe ich die Klasse angehängt.

Viel Spass noch ;)


hier der link mit der CPicture Klasse

http://www.tutorials.de/forum/showthread.php?t=177429
 
Vielen Dank! Habs mir mal runtergeladen und werde gleich mal testen.
Aber trotzdem würde ich gern noch rausfinden wieso ich kein Array der
Bitmap Klasse anlegen kann... rein vom Grundverständniss her :-/

edit: Jetzt muss ich nochmal fragen was hier falsch ist :

CPicture m_Picture;
m_Picture.Load("h2o_hund.jpg");

ich bekomme Fehler von "unaufgelösten externen Symbolen" ?!
 
Zuletzt bearbeitet:
Sorry, sehe da jetzt keinen Fehler, aber du kannst ja mal schaun ob das mit dem hier vergleichbar ist...
Dieser Code ist von mir und funktioniert.


Code:
	CRect displaysize;
 CWnd *curwnd = CWnd::GetActiveWindow();
	curwnd->GetWindowRect(displaysize); 
 pDC = new CClientDC( curwnd );
 m_Picture.Load("test.jpg"); // Load From a File - Just Load It (Show Later)
 m_Picture.UpdateSizeOnDC(pDC); 
	picwidth = (int)m_Picture.m_Width;
 picheight = (int)m_Picture.m_Height;

 width = (int)displaysize.right;
	height = (int)displaysize.bottom;
 m_Picture.Show(pDC, CRect(0, 0-picheight/2, width, height));   //anzeigen des geladenen bildes


Sollte dir das nicht heflen, dann poste mal bitte die komplette Funktion in der du den Fehler hast.
 
edit: man bin ich dumm... hatte vergessen die Picture .cpp und .h ins Project aufzunehmen. hatte nur die .h included ... jetz gehts! Vielen Dank nochmal


hab jetzt doch nochmal eine Frage :

CFileDialog dlg(TRUE);
dlg.DoModal();

CPicture bild;
bild.Load(dlg.m_ofn.lpstrFile);

int TeileCount = 5;

teile = new CPicture[TeileCount];


das Programm soll folgendes machen, ein Bild einlesen, und dann in diverse Teile
zerlegen. Ich möchte diese Einzelteile gern in separaten CPicture Objekten "abspeichern" ... dazu legt er zur Laufzeit ein dynamisches CPicture Array an (letzte Zeile) ... doch wie kann ich jetzt bestimmte Bildausschnitte aus dem Originalbild in die Teile Objekte kopieren?!
 
Zuletzt bearbeitet:
Also ich habe bei meinem Programm das noch nie gemacht, aber ich würde mal versuchen mit der m_picture.Show(); verschiedene bildausschnitte anzeigen zu lassen. (dazu müsstest du mit den Koordinaten ein wenig rumspielen...)
Sollte das gehen, dann kannst du die Koordinaten in deinem Array speichern, und dann wiederrum die Bilder in einer for Schleife aus dem Array auslesen und mit Show anzeigen...


Aber das ist alles nur eine Idee, habe das selbst noch nicht getestet, also kann ebensogut danebenliegen :suspekt:

Aber wozu willst du das Bild überhaupt zerlegen, kannst du das nicht schon zerlegt vorgeben ? (Puzzle Programm ?)
 
Richtig geraten :) ... ja es soll ein Puzzle werden (in ferner Zukunf ;)

Man soll ein Bild reinladen können, dann soll es zerlegt werden und dann soll man puzzlen können.

Ich habe jetzt doch einen Weg per GDI+ gefunden. Und zwar folgendermaßen :

Bitmap bild(L"h2o_hund.jpg");
Bitmap *teile[5];

teile[0] = bild.clone(x, y, s_x, s_y)

das ganze in einer Schleife funktioniert wunderbar. Jetzt muss ich es nur noch hinbekommen das Pointer Array dynamisch zu machen.
 
hab mal geschaut, das hier klappt :

Bitmap * test;

test = (Bitmap*) malloc(sizeof Bitmap);
test = bild.Clone(Rect(0, 0, 210, 252), PixelFormatDontCare);

das hier leider ned :

test = (Bitmap*) malloc(sizeof(Bitmap[3]));
test[0] = bild.Clone(Rect(0, 0, 210, 252), PixelFormatDontCare);

woran haperts ?! Ich will doch nur ein dynamisches Array. Als Fehler spuckt er :

"Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operator vom Typ 'Gdiplus::Bitmap *' akzeptiert (oder keine geeignete Konvertierung möglich)"

aus

mit NEW hab ichs auch probiert aber da kommen noch viel mehr Fehler :

Bitmap *test;

test = new Bitmap();

--> es gibt keinen Standartkonstruktor
 
Zurück