2017-05-30 3 views
0

Ich arbeite an einer Bildschirmaufnahme-Methode für mein Programm. Bei jeder Bildschirmaufnahme versuche ich, das Bild basierend auf der DateTime auf die Sekunde zu benennen. Im Moment würde alles wie screen.jpg heißen.C++: Konvertieren von DateTime als Dateiname

Wie kann ich "Bildschirm" auf die aktuelle DateTime ändern?

Ich habe versucht, mit der Zeile, die es nennt, herumspielen, aber ich bekomme immer Fehler wie "Ausdruck muss integral oder uncoped Enum-Typ haben." Ich bin mir nicht sicher, was das bedeutet.

void BitmapToJpg(HBITMAP hbmpImage, int width, int height) 
{ 
    time_t now = time(0); 
    char* dt = ctime(&now); 

    Bitmap *p_bmp = Bitmap::FromHBITMAP(hbmpImage, NULL); 
    //Bitmap *p_bmp = new Bitmap(width, height, PixelFormat32bppARGB); 

    CLSID pngClsid; 
    int result = GetEncoderClsid(L"image/jpeg", &pngClsid); 
    if (result != -1) 
     std::cout << "Encoder succeeded" << std::endl; 
    else 
     std::cout << "Encoder failed" << std::endl; 
    p_bmp->Save(L"screen_.jpg", &pngClsid, NULL); 
    delete p_bmp; 
} 

UPDATE:

Diese Version hat mir nicht gegeben Fehler, so dass ich werde versuchen, es zu benutzen. Ich werde diesen Beitrag aktualisieren, um zu überprüfen, ob er ordnungsgemäß funktioniert oder nicht, wenn mein Programm versucht, es zu verwenden! :)

Revised Code:

void BitmapToJpg(HBITMAP hbmpImage, int width, int height) 
{ 
    time_t now = time(0); 
    char* dt = ctime(&now); 

    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; 
    std::wstring wide = converter.from_bytes(dt); 


    Bitmap *p_bmp = Bitmap::FromHBITMAP(hbmpImage, NULL); 
    //Bitmap *p_bmp = new Bitmap(width, height, PixelFormat32bppARGB); 

    CLSID pngClsid; 
    int result = GetEncoderClsid(L"image/jpeg", &pngClsid); 
    if (result != -1) 
     std::cout << "Encoder succeeded" << std::endl; 
    else 
     std::cout << "Encoder failed" << std::endl; 
    std::wstring fileName = std::wstring(L"screen_") + wide + (L".jpg"); 
    p_bmp->Save(fileName.c_str(), &pngClsid, NULL); 
    delete p_bmp; 
} 
+0

Haben Sie versucht, dieses Datum in eine Zeichenfolge umzuwandeln? – wdc

+0

Da die Save-Methode eine breite Zeichenfolge akzeptiert, müssen Sie char * dt in wstring konvertieren: https://stackoverflow.com/questions/2573834/c-convert-string-or-char-to-wstring-or-wchar- t und dann verketten Sie das Ergebnis einfach mit der Dateinamenerweiterung. – Dom

+0

std :: time (0) "ist fast immer ein ganzzahliger Wert, der die Anzahl der Sekunden (ohne Schaltsekunden) seit 00:00, 1. Jan. 1970 UTC, entsprechend der POSIX-Zeit, enthält" Also für eine einmalige (pro Sekunde) Datei Name, könnten Sie in Betracht ziehen, an "image /" die POSIX-Zeit "std :: to_string (std :: time (0))" und dann vielleicht "/ jpeg" anzuhängen? –

Antwort

4

Du bist da eigentlich fast. Es muss jedoch noch etwas getan werden, damit dies funktioniert. Bei der letzten Bearbeitung des Codes übergeben Sie den ersten Parameter Bitmap::Save (und inhärent Image::Save) vom Typ std::wstring, wobei letzterer ein typedef für std::basic_string<wchar_t> ist. Die Methode erfordert jedoch, dass der erste Parameter WCHAR * lautet. Also, alles, was Sie tun müssen, ist, problematische Zeilen wie folgt neu zu schreiben:

Dies sollte den Trick tun.

Der Grund des Problems ist, std::basic_string<CharT> kann implizit nicht in CharT* konvertiert werden, und es gibt eine bestimmte Schnittstelle für eine solche Konvertierung, nämlich std::basic_string<CharT>::c_str().

Verwandte Themen