none
Laden von Daten aus Resourcen RRS feed

  • Frage

  • Hallo Forum

    Ich möchte gerne verschlüsselte Bilder in die Resourcen einbinden und bei Bedarf aus diesen herausladen, entschlüsseln und anzeigen. Dazu ergeben sich naturbedingt gleich mehrere Fragen:

    * Wie kopiere ich aus einer Resource in meinen eigenen Speicher-Puffer? Muss ich da die - mir immer noch unverständlichen - GlobalAlloc Funktionen etc. verwenden?

    * Wie zeige ich ein Bild aus einem Speicher-Puffer an? Ich weiß zwar, dass CBitmap ein Schreiben von Roh-Daten in den Datenbereich erlaubt, aber ich fürchte, das wird nicht wirklich funktionieren, weil die Sache Device-Dependent ist. Ich habe meine Bilder in 16-Farben vorliegen und damit das Bitmap auch funktioniert, muss es auf den meisten Rechnern 32-Bit TrueColor sein. Die interne LoadBitmap Funktion, die ein Bild aus einer 16-Farben Resource lädt, macht dies ja ganz automatisch.

    * Alternativ dazu könnte ich den Speicher-Puffer auch mit der CPicture Klasse anzeigen lassen...allerdings scheint da die Funktion zum Anzeigen eines Bildes aus einem Speicher nur im "private" Bereich der Klasse auf...habt Ihr da Erfahrung?

    Habt Ihr zu diesen Themen Links und/oder Codeschnipsel?

    Grüße

    FireHeart

     

    Montag, 20. September 2010 09:23

Antworten

  • Hallo FireHeart

    ****** Wie kopiere ich aus einer Resource in meinen eigenen Speicher-Puffer?

    Du könntest z.b. eine benutzerdefinierte Ressource auf diese Art aus Deiner Anwendung laden:

    #define RESOURCE_TYPE _T("USER_RES")
    ...
    // Access ressource
    HRSRC l_ResHandle_h;
    DWORD l_Size_dw;
    HGLOBAL l_ResLoad_h;
    ...
    l_ResHandle_h=::FindResource(l_Instance_h, MAKEINTRESOURCE(1), RESOURCE_TYPE);
    l_Size_dw=::SizeofResource(l_Instance_h, l_ResHandle_h);
    l_ResLoad_h=::LoadResource(l_Instance_h, l_ResHandle_h);
    l_ResData_pc=(char*)LockResource(l_ResLoad_h);
    ...
    l_MemData_pc=new char[l_Size_dw];
    memcpy(l_MemData_pc, l_ResData_pc, l_Size_dw);
    // decode data
    Decode(l_MemData_pc, l_Size_dw);

    Hinweis: Es handelt sich hier nur um ein groben Überblick, wie man sowas handlen könnte, der Code ist nicht komplett und hat so memory leaks, da deletes etc fehlen!!

    ****** Wie zeige ich ein Bild aus einem Speicher-Puffer an?

    Das könntest Du mit

    CreateCompatibleBitmap einem MemoryDC und einem DIB (SetDIBits) machen. Ich habe noch ein paar vielleicht hilfreiche Links angefügt, die Bitmaps aus einem Puffer holen, oder ein Bitmappuffer manipüulieren zwecks verdeutlichung wie und wo ich ein Puffer befüllen könne.

    Gruß

    bordon

     

    http://www.codeproject.com/KB/graphics/creategrayscaleicon.aspx

    http://www.codeproject.com/KB/graphics/gditutorial.aspx

    http://stackoverflow.com/questions/2886831/win32-c-c-load-image-from-memory-buffer

    Montag, 20. September 2010 10:56

Alle Antworten

  • LoadBitmap, BitBlt!
    http://www.winprog.org/tutorial/bitmaps.html


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 20. September 2010 10:28
    Moderator
  • Folgende Schritte zur ersten Frage (auf RC_DATA im Programm zugreifen):

    -- Resource finden:

    HRSRC hr_data1 = FindResource(hMod, MAKEINTRESOURCE(IDR_ROHDATA1_IN_RESOURCEN ), RT_RCDATA ));

    -- Resource laden:

    HGLOBAL h_data1 = LoadResource(hMod, hr_data1);

    -- Resourcenzeiger besorgen:

    LPVOID pData1 = LockResource(h_data1);

    -- Danach sind die Rohdaten unter pData1 zu finden.

    Zur zweiten Frage (CImage Laden von Rohdaten und Darstellung):

    Da ATL und MFC im Spiel ist, dann das ganze per Streams in ein CImage laden. Das kann dann wiederum direkt in die UI gemalt werden.

     

    Montag, 20. September 2010 10:38
  • Hallo FireHeart

    ****** Wie kopiere ich aus einer Resource in meinen eigenen Speicher-Puffer?

    Du könntest z.b. eine benutzerdefinierte Ressource auf diese Art aus Deiner Anwendung laden:

    #define RESOURCE_TYPE _T("USER_RES")
    ...
    // Access ressource
    HRSRC l_ResHandle_h;
    DWORD l_Size_dw;
    HGLOBAL l_ResLoad_h;
    ...
    l_ResHandle_h=::FindResource(l_Instance_h, MAKEINTRESOURCE(1), RESOURCE_TYPE);
    l_Size_dw=::SizeofResource(l_Instance_h, l_ResHandle_h);
    l_ResLoad_h=::LoadResource(l_Instance_h, l_ResHandle_h);
    l_ResData_pc=(char*)LockResource(l_ResLoad_h);
    ...
    l_MemData_pc=new char[l_Size_dw];
    memcpy(l_MemData_pc, l_ResData_pc, l_Size_dw);
    // decode data
    Decode(l_MemData_pc, l_Size_dw);

    Hinweis: Es handelt sich hier nur um ein groben Überblick, wie man sowas handlen könnte, der Code ist nicht komplett und hat so memory leaks, da deletes etc fehlen!!

    ****** Wie zeige ich ein Bild aus einem Speicher-Puffer an?

    Das könntest Du mit

    CreateCompatibleBitmap einem MemoryDC und einem DIB (SetDIBits) machen. Ich habe noch ein paar vielleicht hilfreiche Links angefügt, die Bitmaps aus einem Puffer holen, oder ein Bitmappuffer manipüulieren zwecks verdeutlichung wie und wo ich ein Puffer befüllen könne.

    Gruß

    bordon

     

    http://www.codeproject.com/KB/graphics/creategrayscaleicon.aspx

    http://www.codeproject.com/KB/graphics/gditutorial.aspx

    http://stackoverflow.com/questions/2886831/win32-c-c-load-image-from-memory-buffer

    Montag, 20. September 2010 10:56
  • Ich möchte gerne verschlüsselte Bilder in die Resourcen einbinden und bei
    Bedarf aus diesen herausladen, entschlüsseln und anzeigen.

    Jetzt sehe ich erst, dass es um verschlüsselte Bitmaps gehen soll!

    Tipp: Lass es als Bitmaps in der EXE. Aber lege mit XOR einen Brush drüber, den Du definierst. Bei der Ausgabe im BitBlt gibst Du wieder den entsprechenden Brush an und die ROP...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 20. September 2010 11:54
    Moderator
  • Hallo Martin

    Ich hab's jetzt geschafft, die Anleitung von Bordon war sehr hilfreich

    Ich hab mir zunächst ein externes Programmchen geschrieben, das die Bitmaps zunächst komprimiert (über ZLIB) und dann über AES (128 Bit Schlüsseltiefe ... hat ne Weile gedauert, bis ich im Internet einen brauchbaren Source-Code gefunden hatte) verschlüsselt.

    Diese Dateien hab ich dann als allgemeine Resource importiert und wenn ich sie brauche, dann mache ich:

    HRSRC hres = FindResource(NULL,MAKEINTRESOURCE(BMP_ID),"ZOOMPIX");
    HGLOBAL hgl = LoadResource(NULL,hres);
    unsigned char *pData = (unsigned char*)LockResource(hgl);
    unsigned long size = SizeofResource(NULL,hres);
    ... // entschlüsseln, entpacken nach pBMP
    m_pic.LoadFromBuffer(pBMP,bmpsize);
    memcpy(&m_backinfo.cx,&pBMP[18],4);
    memcpy(&m_backinfo.cy,&pBMP[22],4);

    Dazu musste ich allerdings eine CPicture Klasse suchen, die als *.h und *.cpp vorlag, weil die LoadFromBuffer Funktion normalerweise im nicht-public Teil der Klasse liegt und man es, wenn man nur *.h und *.lib hat, nicht mehr compilieren kann.

    Jedenfalls funktioniert das jetzt ganz super.

    FireHeart

    Dienstag, 21. September 2010 12:07