Массив C++ BYTE* в изображение JPEG (libjpeg)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Массив C++ BYTE* в изображение JPEG (libjpeg)

Сообщение Anonymous »


Я пытаюсь написать приложение для хранения снимков экрана на внешнем сервере, но из-за ограниченности ресурсов мне хотелось бы хранить их в текстовой форме, а именно в виде массива BYTE*. В результате я столкнулся с некоторыми проблемами, связанными с чтением скриншотов, загруженных на сервер. Я могу прочитать и сохранить любой снимок экрана, сделанный во время сеанса, в любое время на своем компьютере, но снимки экрана, сделанные моим другом, создаются как файлы размером 0 КБ без содержимого и приводят к сбою приложения во время выполнения функции, отвечающей за сканирование строк. .

LPBYTE SaveScreenshotNew() { int nScreenWidth = GetSystemMetrics (SM_CXSCREEN); int nScreenHeight = GetSystemMetrics(SM_CYSCREEN); HDC hdcScreen = GetDC (NULL); HDC hdcMem = CreateCompatibleDC(hdcScreen); HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, nScreenWidth, nScreenHeight); SelectObject(hdcMem, hBitmap); BitBlt(hdcMem, 0, 0, nScreenWidth, nScreenHeight, hdcScreen, 0, 0, SRCCOPY); intufferSize = nScreenWidth * nScreenHeight * 3; Буфер LPBYTE = новый BYTE[bufferSize]; БИТМАПИНФОХЕДЕР би; memset(&bi, 0, sizeof(BITMAPINFOHEADER)); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = nScreenWidth; bi.biHeight = -nScreenHeight; bi.biPlanes = 1; bi.biBitCount = 24; bi.biCompression = BI_RGB; bi.biSizeImage = 0; if (GetDIBits(hdcScreen, hBitmap, 0, nScreenHeight, буфер, (BITMAPINFO*)&bi, DIB_RGB_COLORS) != 0) { for (int i = 0; i < nScreenHeight; i++) { for (int j = 0; j < nScreenWidth; j++) { int index = я * nScreenWidth * 3 + j * 3; БАЙТ синий = буфер[индекс]; буфер[индекс] = буфер[индекс + 2]; буфер[индекс + 2] = синий; } } } УдалитьОбъект(hBitmap); УдалитьDC(hdcMem); ReleaseDC (NULL, hdcScreen); возвратный буфер; } Код jpeglib:

ФАЙЛ* outfile = fopen(szPath, "wb"); структура jpeg_compress_struct cinfo; структура jpeg_error_mgr Джерр; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest (& cinfo, выходной файл); cinfo.image_width = sWidth; cinfo.image_height = sHeight; cinfo.input_comComponents = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&cinfo); jpeg_start_compress(&cinfo, ИСТИНА); while (cinfo.next_scanline < cinfo.image_height) { JSAMPROW row_pointer = &gScreenPacket.lpData[cinfo.next_scanline * cinfo.image_width * cinfo.input_comComponents]; jpeg_write_scanlines(&cinfo, &row_pointer, 1); } jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); fclose (выходной файл); Я пробовал:

увеличение/уменьшение размера буфера, изменение функции сохранения скриншотов, используя другую доступную функцию в jpeglib.

Tyvm за вашу помощь.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»