screenshot



  • WebFritzi schrieb:

    Nein, du kannst kein C++. Lies dir nochmal ein Tutorial durch!

    hi...habs überlesen...is ja ein constructor;-)

    #define MAX_CHARACTERS 81 
    
    int dc2bitmap(HDC hdc, int width, int height, char *filename) 
    { 
       HDC hdc2; 
    
       Bitmap*     pBitmap;
       wchar_t file_name[MAX_CHARACTERS]; 
    
       // String in Unicode umwandeln 
       mbstowcs(work, filename, MAX_CHARACTERS); 
    
       // Bitmap erstellen 
       pBitmap = new Bitmap(file_name, FALSE);      // FALSE specifies that color correction is not enabled 
    
       delete pBitmap;
    
       return 1; 
    }
    

    passts nun??? wie mach ich das weiter????

    thx 👍



  • OK, du hast's kapiert. 😉 Das new brauchst du aber AFAIK nicht. Du kannst die GDI+ - Objektinstanzen IMHO alle auf dem Stack anlegen.

    EDIT: Bekommst du denn jetzt noch irgendwelche Linkerfehler, oder hast du jetzt alles ordentlich eingebunden gekriegt?



  • WebFritzi schrieb:

    OK, du hast's kapiert. 😉 Das new brauchst du aber AFAIK nicht. Du kannst die GDI+ - Objektinstanzen IMHO alle auf dem Stack anlegen.

    EDIT: Bekommst du denn jetzt noch irgendwelche Linkerfehler, oder hast du jetzt alles ordentlich eingebunden gekriegt?

    so gehts ohne error:

    int dc2bitmap(HDC hdc, int width, int height, char *filename) 
    { 
       HDC hdc2; 
    
       Bitmap* pBitmap; 
       wchar_t file_name[MAX_CHARACTERS]; 
    
       // String in Unicode umwandeln 
       mbstowcs(file_name, filename, MAX_CHARACTERS); 
    
       // Bitmap erstellen 
       pBitmap = new Bitmap(file_name, FALSE);      // FALSE specifies that color correction is not enabled 
    
       delete pBitmap; 
    
       return 1; 
    }
    

    aber das new braucht er anscheinend!!! sonst bekomm ich einen error! was soll ich als nächstes machen???
    danke webfritzi, das du an mich glaubst;-) 👍
    thx 👍



  • markoo schrieb:

    was soll ich als nächstes machen???

    Du sollst die Dokumentation lesen. Wenn noch etwas unklar ist, kannst Du gern nochmal nachfragen, aber vielleicht etwas gezielter.



  • -King- schrieb:

    markoo schrieb:

    was soll ich als nächstes machen???

    Du sollst die Dokumentation lesen. Wenn noch etwas unklar ist, kannst Du gern nochmal nachfragen, aber vielleicht etwas gezielter.

    hi, ja jetzt hab ich ein Bitmap object erstellt! wie kann ich kann ich die hdc bildinformation da rein speichern???

    thx 👍



  • Beschäftige dich doch ein wenig mit der Doku. Dann wirst du es auch herausfinden.



  • WebFritzi schrieb:

    Beschäftige dich doch ein wenig mit der Doku. Dann wirst du es auch herausfinden.

    ok gut;-) bitte gibs mir den link, weil ich bin mir nicht sicher ob ich das richtige vor hab....!?? danke webdritzi! 👍

    thx 👍



  • Den Link zur Doku hast du doch jetzt schon des öfteren bekommen 😕



  • flenders schrieb:

    Den Link zur Doku hast du doch jetzt schon des öfteren bekommen 😕

    jo! aber ich weiß nicht mehr genau welcher mir zum erfolg verhilft;-( !??

    thx 👍



  • Du solltest ja auch selber etwas rumstöbern:

    Schau dich mal hier um: Bitmap Class und Image Class



  • flenders schrieb:

    Du solltest ja auch selber etwas rumstöbern:

    Schau dich mal hier um: Bitmap Class und Image Class

    ok ok.... ich kann ja auch da mir was abschauen: ???
    http://www.c-plusplus.net/forum/viewtopic.php?t=64679
    hmm? brauch ich ja nen BITMAPINFOHEADER was ich gesehn habe...?

    thx 👍



  • Ach, mach doch, was du willst!



  • Hier mal ne ungefähre Anleitung, sind vermutlich Fehler drin - Vielleicht hilft dir das zumindest etwas....

    1. Variablen und so die deine Funktion braucht:
    GdiplusStartupInput gsi; // GDI+ Einstellungen
    ULONG_PTR gdiplusToken; // GDI+
    Bitmap *neBitmap; // Die Bitmap-Klasse ist von der Image-Klasse abgeleitet und kann daher auch speichern :D
    CLSID encoderClsid; // Die CLSID des Encoders kommt da später rein
    BITMAPINFO bi; // Hier kommen Bildinformationen rein
    char *pixels; // Hier werden die einzelnen Pixel drin gespeichert...
    
    1. Zuerst mal GDI+ initialisieren
    GdiplusStartup(&gdiplusToken, &gsi, NULL);
    
    1. Dann nen Bitmap-Objekt erzeugen:
    // Informationen über das neue Bild sammeln:
    ZeroMemory(&bi,sizeof(BITMAPINFO));
    bi.bmiHeader.biBitCount=32;
    bi.bmiHeader.biCompression=BI_RGB;
    bi.bmiHeader.biHeight=-100; // Bild ist 100 Pixel hoch
    bi.bmiHeader.biWidth=100; // Bild ist 100 Pixel breit
    bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    bi.bmiHeader.biPlanes=1;
    
    // Speicher für die Pixel reservieren:
    pixels=(char*)malloc( 100*100*3 ); // Höhe*Breite*3
    
    // Hier jetzt irgendwie die Pixel setzen...
    
    // Bild mit den Pixeln in 'pixels' und den Informationen in bi erzeugen:
    neBitmap=new Bitmap(&bi,pixels);
    
    1. Encoder-ID rausfinden, um ne *.png Datei zu erzeugen (mit dem 3. Parameter der hier NULL ist, kann man z.B. bei jpegs noch angeben welche Qualität er nehmen soll oder sonstige Encoder-Einstellungen...):
    // Diese Funktion gibt es nicht!
    // Die Funktion steht in der MSDN/PSDK als Beispiel!
    // Nach 'Retrieving the Class Identifier for an Encoder' in der MSDN oder PSDK-Doku suchen!
    GetEncoderClsid(L"image/png", &encoderClsid);
    
    1. Bild speichern:
    neBitmap->Save(L"beispiel.png",&encoderClsid,NULL);
    
    1. Aufräumen:
    // Pixelspeicher freigeben:
    free(pixels);
    
    // Bitmap-Objekt freigeben:
    delete neBitmap;
    
    // GDI+ freigeben:
    GdiplusShutdown(gdiplusToken);
    


  • Hallo,

    mich hat dieses thema auch schon immer interessiert!
    Soweit klappt ja alles ganz gut, nur wie mache ich das??

    // Hier jetzt irgendwie die Pixel setzen...

    mfG MisterX



  • Am aller einfachsten (aber evtl. nicht am schnellsten - k.A.) ist folgendes:
    "// Hier jetzt irgendwie die Pixel setzen..." <= Einfach weglassen und das Bitmap-Objekt erstellen, dann sind erstmal irgendwelche zufälligen Pixelfarben da...
    Das Bitmap-Objekt hat nämlich ne Methode "SetPixel", womit man sehr einfach Pixel setzen kann, nachdem man das Bitmap-Objekt erzeugt hat:

    neBitmap->SetPixel(x,y,RGB(255,0,0)); // roten Pixel bei P(x/y) setzen.
    


  • also so:

    int dc2bitmap(HDC hdc, int width, int height, char *filename) 
    { 
        HDC hdc2;
        Bitmap* pBitmap; 
        wchar_t file_name[MAX_CHARACTERS]; 
    
        // String in Unicode umwandeln 
        mbstowcs(file_name, filename, MAX_CHARACTERS); 
    
        // Bitmap erstellen 
        pBitmap = new Bitmap(file_name, FALSE);      // FALSE specifies that color correction is not enabled 
    
        pBitmap->SetPixel(x,y,RGB(255,0,0)); // roten Pixel bei P(x/y) setzen.
    
        delete pBitmap; 
    
        return 1;
    }
    

    was sagst du zu dem geeky?
    thx 👍



  • hi geeky...weißt du was mir an deinem code bissi sorgen macht, das:
    bi.bmiHeader.biCompression=BI_RGB;
    ich will das ja kompremiert speichern.....da geht das nicht mit biCompresssion, da man da mit der hand kompremieren muss...ich würds aber gerne automatisch machen ohne viel aufwand!

    thx geeky 👍



  • Bitmap::Bitmap(WCHAR* filename ,BOOL useIcm)
    // Creates a Bitmap object based on an image file.

    Das bedeutet, dass Du ein Bitmap-Objekt im Speicher erzeugst!
    Und zwar wird das Bitmap-Objekt im Speicher genauso aussehen wie das Bild, dass unter dem Dateinamen <filename> SCHON EXISTIERT!
    Der Quellcode speichert also gar nichts!

    bi.bmiHeader.biCompression=BI_RGB;
    Damit gebe ich nur an in welchem Format die Daten im Speicher vorliegen - nicht wie die Bilddaten gespeichert werden!
    Das speichern geschieht mit neBitmap->Save(..);

    Evtl. sollte du hier alles nochmal ganz in Ruhe durchlesen und nochmal in der MSDN/PSDK bei "Bitmap" und "Image" ein bisschen rumlesen sowie nochmal ein wenig in einem C++ Tutorial/Buch lesen...



  • geeky schrieb:

    Bitmap::Bitmap(WCHAR* filename ,BOOL useIcm)
    // Creates a Bitmap object based on an image file.

    Das bedeutet, dass Du ein Bitmap-Objekt im Speicher erzeugst!
    Und zwar wird das Bitmap-Objekt im Speicher genauso aussehen wie das Bild, dass unter dem Dateinamen <filename> SCHON EXISTIERT!
    Der Quellcode speichert also gar nichts!

    bi.bmiHeader.biCompression=BI_RGB;
    Damit gebe ich nur an in welchem Format die Daten im Speicher vorliegen - nicht wie die Bilddaten gespeichert werden!
    Das speichern geschieht mit neBitmap->Save(..);

    Evtl. sollte du hier alles nochmal ganz in Ruhe durchlesen und nochmal in der MSDN/PSDK bei "Bitmap" und "Image" ein bisschen rumlesen sowie nochmal ein wenig in einem C++ Tutorial/Buch lesen...

    hi, ja das problem was ich habe ich das kompremierte speichern, mit dem komm ich nicht ganz zurecht!;-( bi.bmiHeader.biCompression=BI_RGB; das dann speichern schaff ich auch.....aber kompremiert speichern nicht;-( 😕

    thx 👍



  • geeky schrieb:

    1. Encoder-ID rausfinden, um ne *.png Datei zu erzeugen (mit dem 3. Parameter der hier NULL ist, kann man z.B. bei jpegs noch angeben welche Qualität er nehmen soll oder sonstige Encoder-Einstellungen...):
    // Diese Funktion gibt es nicht!
    // Die Funktion steht in der MSDN/PSDK als Beispiel!
    // Nach 'Retrieving the Class Identifier for an Encoder' in der MSDN oder PSDK-Doku suchen!
    GetEncoderClsid(L"image/png", &encoderClsid);
    
    1. Bild speichern:
    neBitmap->Save(L"beispiel.png",&encoderClsid,NULL);
    

    Hat das nicht geklappt? Was für Fehler bekommst du?


Anmelden zum Antworten