как преобразовать байт * в файл JPEG в VC ++ - PullRequest
0 голосов
/ 07 марта 2009

как преобразовать байт * в файл JPEG в VC ++

Я собираю сэмплы видео и записываю их в виде файлов bmp, но я хочу записать эти сэмплы видео в файл jpeg, используя поддержку MFC в ATL COM.

Ответы [ 4 ]

2 голосов
/ 07 марта 2009

Используйте libjpg. Скачать с: http://www.ijg.org/

0 голосов
/ 21 января 2010

Вы также можете попробовать использовать класс CxImage C ++ для сохранения фотографий в формате JPEG.

В CodeProject доступно еще несколько ориентированных на Windows API альтернатив, например, CMiniJpegEncoder

Можно даже рендерить JPEG в файл из растрового изображения Windows, используя библиотеку libgd , если она скомпилирована с поддержкой libjpeg. Вот код небольшой функции расширения gdImageTrueColorAttachBuffer Я разработал для этой цели некоторое время назад:

// 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;
}

Надеюсь, это поможет.

0 голосов
/ 07 марта 2009

Исходные данные изображения в JPEG могут быть получены с помощью ImageMagick.

0 голосов
/ 07 марта 2009

Из того, что кажется, у вас есть данные изображения в буфере, на который указывает объект byte. Обратите внимание, что тип на самом деле BYTE (все прописные). Если данные уже в формате JPEG, почему бы вам не записать эти данные в файл (с подходящим расширением «.jpg» или «.jpeg») и не попробовать загрузить его с помощью редактора изображений? В противном случае вам потребуется декодировать его в необработанный формат и кодировать в формате JPEG.

Или вам нужно объяснить проблему более подробно, желательно с некоторым кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...