screenshot



  • 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?



  • nö net ganz....weil wie bekomm ich da die HDC hdc information rein???
    werd morgn das ganze weiter machen....also heute mittag;-)

    thx 👍



  • // 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);
    

    ich bekomm da nen fehler:
    screen.cpp(191) : error C2065: 'GetEncoderClsid' : nichtdeklarierter Bezeichner

    is auch irgendwie klar....die funktion gibs es nicht...aber was soll man da machen?

    thx 👍



  • Das was ich in dem Kommentar dahin geschrieben hab:

    Nach 'Retrieving the Class Identifier for an Encoder' in der MSDN oder PSDK-Doku suchen!



  • geeky schrieb:

    Das was ich in dem Kommentar dahin geschrieben hab:

    Nach 'Retrieving the Class Identifier for an Encoder' in der MSDN oder PSDK-Doku suchen!

    jaja, ich hab ja keine psdk-doku runtergeladn;-(

    thx 👍




Anmelden zum Antworten