HBITMAP in IPicture umwandeln?

McGreg

Grünschnabel
Hallo an alle, ich versuchs mal nochmal:

Ich will mit Hilfe der IPicture Class ein Bild anzuzeigen.

Um die Daten zu laden, brauche ich entweder eine Datei oder ein Buffer im Speicher.

Wie wandle ich eiim HBITMAP (o.ä.) in solchen Buffer um, damit es IPicture akzeptiert?


Oder kann mir jemand helfen, wie ich ein Bild aus dem Speicher, NICHT aus einer Datei mit IPicture verknüpfen kann?

Ich hoffe ihr könnt mir weiterhelfen!
 
Hi ...

schau dir mal die Funktion 'OleLoadPicture' an.
Damit sollte es gehen. Ich weiß nicht ob ich das schonmal erfolgreich gemacht hab, ist ne Weile her, aber sollte die richtige Funktion sein.

Gruß
Shai
 
Hallo Shai,

erstmal vielen Dank für die Antwort.

Tja, ich habe mir schonmal die Ole Funktion angeguckt, aber da werd ich nicht schlau draus:
STDAPI OleLoadPicture(
IStream * pStream, //Was soll das sein? ein CBitmap, rohe bilddata?
LONG lSize, //das ist verständlich
BOOL fRunmode, //das geht auch noch
REFIID riid, //Reference to the identifier of the interface
// describing the type of interface pointer to return -> Was ist das?
VOID ppvObj //Address of output variable that receives interface
// pointer requested in riid-> häää?
);


irgendwelche vorschläge?
 
Das habe ich schon gemacht!

Leider handelt es sich bei den von dir genannten Links um Verfahren, wie man Bilder aus Dateien rausliest, mein Bild liegt direkt im Speicher als ein BYTE Buffer vor.
 
Nein, leider nicht, denn dazu fehlen die ganzen Header Informationen!
In meinem BYTE Buffer sind die reinen Pixelinformationen.
Deswegen dachte ich, ich mach erstmal aus dem Buffer einen CBitmap aber das ist ja dann was ganz anderes als ein IStream
 
Hi ...

Zu der Funktion OleLoadPicture:

Habe da ein Beispiel, weiß aber nicht mehr ob das auch funktioniert hat, sieht irgendwie zerpflückt aus bei mir, hab das nämlich mitten drin irgendwann abgebrochen das Projekt.

Ich habe mehrere Bilder in eine Date gepackt, d.h. einfach einen Header in dem die Infos über die Datein drin stehen und dann alle Dateien hintereinander in der einen großen Datei ... viel Sinn hat das nicht, da ja nix gepackt wird oder so, aber gibt halt nich so viel Müll auf der Platte ... ;)
Code:
IPicture	*pPicture;												// IPicture Interface
IStream	*pStream;
// eigene File-Klasse
File		*pFileIn;

// pStream laden, weiß leider nicht mehr wie, hab ich wohl gelöscht *g*, einfach mal in MSDN schauen

// header auslesen
pStream->Read(&header,2,NULL);
pStream->Read(&numOfFiles,1,NULL);

// numOfFiles dateien anlegen
pFileIn = new File[numOfFiles];

// Daten für jede Datei aus dem Strea lesen (länge, name usw.)
for(m=0;m<numOfFiles;++m)
{
	pStream->Read(&pFileIn[m].lLength,4,NULL);
	pStream->Read(&pFileIn[m].iNameLength,1,NULL);
	pStream->Read(&pFileIn[m].strName,pFileIn[m].iNameLength+1,NULL);
}

// jede Datei aus dem Stream lesen
for(m=0;m<numOfFiles;++m)
{
/*
OleLoadPicture("stream", "länge der datei", "FALSE", "IID_PICTURE", "IPicture-buffer);
*/
HRESULT hr = OleLoadPicture(pStream,pFileIn[m].lLength,FALSE,IID_IPicture,(void**)&pPicture);

// Verarbeitungen für jedes einzelne Bild
}

hoffe das kann dir irgendwie helfen ...

Gruß
Shai
 
Hi Shaijan!

Vielen Dank! Tja, ob es mir hilft weiß ich noch nicht, da ich am erst montags einen Windows Rechner in die Finger bekomme...

Aber ich werde es dann auf jedenfall probieren!
 
So, endlich hab ichs geschafft!

Also nur für die, die es interessiert, ich habe es mit Hilfe der FreeImage Bibliothek und CPicture gelöst:

//Speicher reservieren
FIBITMAP* bitmap = FreeImage_Allocate(_NRows, _NCols, 24);

if (!bitmap) return FALSE;
//Ins FIBITMAP Format konvertieren
bitmap = FreeImage_ConvertFromRawBits(buffer, _NCols, _NRows, _NCols*3, 24, 00FF, x00FF00, 0xFF0000, FALSE);

FIMEMORY* ms=NULL;
ms = FreeImage_OpenMemory();
FreeImage_SaveToMemory(FIF_BMP, bitmap, ms);
FreeImage_Unload(bitmap); //Bild wird nicht mehr benötigt
FreeImage_AcquireMemory(ms, &Memory_Buffer, &Size_in_bytes)

//und dann endlich:

Picture.LoadPictureData(Memory_Buffer, Size_in_bytes);
 
Zurück