2009-03-07 7 views
0

wie Byte * in JPEG-Datei in VC++wie ++ Byte * in JPEG-Datei in VC konvertieren

Ich bin Erfassung Video Proben konvertieren und sie als BMP-Dateien zu schreiben, aber ich will, dass die Video-Samples in JPEG-Datei schreiben Verwenden von MFC-Unterstützung in ATL COM.

+0

Worauf zeigt Ihr Byte *? RGB-Daten? Möchten Sie nur die Daten mit JPEG komprimieren oder möchten Sie eine gültige JPEG-Datei (einschließlich der Header, die von anderen Anwendungen gelesen werden können)? – Anteru

Antwort

0

Von was es aussieht, haben Sie die Bilddaten in einem Puffer, auf den ein byte Objekt zeigt. Beachten Sie, dass der Typ tatsächlich BYTE (Großbuchstaben) ist. Wenn die Daten bereits im JPEG-Format vorliegen, warum schreiben Sie diese Daten nicht in eine Datei (mit einer geeigneten Erweiterung ".jpg" oder ".jpeg") und versuchen Sie, sie mit einem Bildbearbeitungsprogramm zu laden? Andernfalls müssen Sie das im Rohformat dekodieren und im JPEG-Format kodieren.

Oder Sie müssen Ihr Problem genauer erklären, vorzugsweise mit etwas Code.

0

Rohbilddaten zu JPEG können von ImageMagick übernommen werden.

0

Sie können auch versuchen, CxImage C++ - Klasse verwenden, um Ihre Stills in JPEG-codierte Datei zu speichern.

Es gibt einige weitere Windows-API-orientierte Alternativen auf Codeproject, zum Beispiel CMiniJpegEncoder

Es ist sogar möglich, JPEG zu machen von Windows-Bitmap mit libgd Bibliothek Datei, wenn mit libjpeg Unterstützung kompiliert. Hier ist der Code der kleinen Erweiterungsfunktion gdImageTrueColorAttachBuffer ich zu diesem Zweck vor einiger Zeit entwickelt:

// libgd ext// libgd extension by Mateusz Loskot <mateusz at loskot dot net> 
// Originally developed for Windows CE to enable direct drawing 
// on Windows API Device Context using libgd API. 
// Complete example available in libgd CVS: 
// http://cvs.php.net/viewvc.cgi/gd/libgd/examples/windows.c?diff_format=u&revision=1.1&view=markup 
// 
gdImagePtr gdImageTrueColorAttachBuffer(int* buffer, int sx, int sy, int stride) 
{ 
    int i; 
    int height; 
    int* rowptr; 
    gdImagePtr im; 
    im = (gdImage *) malloc (sizeof (gdImage)); 
    if (!im) { 
     return 0; 
    } 
    memset (im, 0, sizeof (gdImage)); 
#if 0 
    if (overflow2(sizeof (int *), sy)) { 
     return 0; 
    } 
#endif 

    im->tpixels = (int **) malloc (sizeof (int *) * sy); 
    if (!im->tpixels) { 
     free(im); 
     return 0; 
    } 

    im->polyInts = 0; 
    im->polyAllocated = 0; 
    im->brush = 0; 
    im->tile = 0; 
    im->style = 0; 

    height = sy; 
    rowptr = buffer; 
    if (stride < 0) { 
     int startoff = (height - 1) * stride; 
     rowptr = buffer - startoff; 
    } 

    i = 0; 
    while (height--) { 
     im->tpixels[i] = rowptr; 
     rowptr += stride; 
     i++; 
    } 

    im->sx = sx; 
    im->sy = sy; 
    im->transparent = (-1); 
    im->interlace = 0; 
    im->trueColor = 1; 
    im->saveAlphaFlag = 0; 
    im->alphaBlendingFlag = 1; 
    im->thick = 1; 
    im->AA = 0; 
    im->cx1 = 0; 
    im->cy1 = 0; 
    im->cx2 = im->sx - 1; 
    im->cy2 = im->sy - 1; 
    return im; 
} 

void gdSaveJPEG(void* bits, int width, int height, const char* filename) 
{ 
    bool success = false; 
    int stride = ((width * 1 + 3) >> 2) << 2; 
    gdImage* im = gdImageTrueColorAttachBuffer((int*)bits, width, height, -stride); 
    if (0 != im) 
    { 
     FILE* jpegout = fopen(filename, "wb"); 
     gdImageJpeg(im, jpegout, -1); 
     fclose(jpegout); 
     success = true; 
    } 
    gdImageDestroy(im); 
    return success; 
} 

Ich hoffe, es hilft.