Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2011, 23:10   #1
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
Вопрос GetEncoderClsid: сохраненный JPG-файл - 0-го размера

Вроде работал, но что-то перестал. Почему-то сохраняет файл имеющий 0-й размер.
Код:
// http://msdn.microsoft.com/en-us/library/ms533843.aspx
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
   UINT  num = 0;          // number of image encoders
   UINT  size = 0;         // size of the image encoder array in bytes

   ImageCodecInfo* pImageCodecInfo = NULL;

   GetImageEncodersSize(&num, &size);
   if(size == 0)
      return -1;  // Failure

   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
   if(pImageCodecInfo == NULL)
      return -1;  // Failure

   GetImageEncoders(num, size, pImageCodecInfo);

   for(UINT j = 0; j < num; ++j)
   {
      if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
      {
         *pClsid = pImageCodecInfo[j].Clsid;
         free(pImageCodecInfo);
         return j;  // Success
      }    
   }

   free(pImageCodecInfo);
   return -1;  // Failure
}

// Сохраннение в файл на диске в формате JPG
void SaveScreenShotJPG()
{
    ULONG_PTR gdiplusToken;
    GdiplusStartupInput gdiplusStartupInput;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    int Width, Height;
    HDC scrdc, memdc;
    HBITMAP membit;
    scrdc  = GetDC(0);
    Height = GetSystemMetrics(SM_CYSCREEN);
    Width  = GetSystemMetrics(SM_CXSCREEN);
    memdc  = CreateCompatibleDC(scrdc);
    membit = CreateCompatibleBitmap(scrdc, Width, Height);
    SelectObject(memdc, membit);
    BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);

    Bitmap *bmp = new Bitmap(membit, NULL);
    Image  *img = bmp->GetThumbnailImage(Width, Height);
    CLSID imgClsid;
    EncoderParameters encoderParams;
    int quality = 65;
    encoderParams.Count = 1;
    encoderParams.Parameter[0].Guid           = EncoderQuality;
    encoderParams.Parameter[0].Type           = 4;
    encoderParams.Parameter[0].NumberOfValues = 1;
    encoderParams.Parameter[0].Value          = &quality;
    GetEncoderClsid(L"image/jpg", &imgClsid);
    int status;
    status = img->Save(L"Z:\\ImageDesktop.jpg", &imgClsid, &encoderParams);
    delete bmp;
    delete img;
}
Что не так?

Вот такой работает (здесь BMP-формат):
Код:
// Сохраннение в файл на диске в формате BMP
void SaveScreenShotBMP()
{
    ULONG_PTR gdiplusToken;
    GdiplusStartupInput gdiplusStartupInput;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    int Width, Height;
    HDC scrdc, memdc;
    HBITMAP membit;
    scrdc  = GetDC(0);
    Height = GetSystemMetrics(SM_CYSCREEN);
    Width  = GetSystemMetrics(SM_CXSCREEN);
    memdc  = CreateCompatibleDC(scrdc);
    membit = CreateCompatibleBitmap(scrdc, Width, Height);
    SelectObject(memdc, membit);
    BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);

    Bitmap *bmp = new Bitmap(membit, NULL);
    Image  *img = bmp->GetThumbnailImage(Width, Height);
    CLSID imgClsid;
    GetEncoderClsid(L"image/bmp", &imgClsid);
    int status;
    status = img->Save(L"Z:\\ImageDesktop.bmp", &imgClsid);
    delete bmp;
    delete img;
}
malor вне форума Ответить с цитированием
Старый 18.04.2016, 15:53   #2
AleksRazgul
Новичок
Джуниор
 
Регистрация: 13.12.2014
Сообщений: 2
По умолчанию

Неправильно указано имя кодека:
GetEncoderClsid(L"image/jpg", &imgClsid);
а должно быть
GetEncoderClsid(L"image/jpeg", &imgClsid);
AleksRazgul вне форума Ответить с цитированием
Старый 18.04.2016, 16:17   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Как вы думаете, за 5 лет ТС додумался до этого или нет?
waleri вне форума Ответить с цитированием
Старый 18.04.2016, 18:19   #4
AleksRazgul
Новичок
Джуниор
 
Регистрация: 13.12.2014
Сообщений: 2
По умолчанию

Думаю додумался . Но я отвечал не столько ему, сколько другим кто будет читать эту тему. Я например искал функцию для сохранения в формате JPEG, и нашел в этой теме.
AleksRazgul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
конвертнуть jpg огромного размера ghest Мультимедиа в Delphi 2 25.12.2010 13:53
удалить сохраненный проект segail Общие вопросы .NET 4 19.06.2010 08:00
Сохранение заданий на печать в файл изображения JPG DimD Фриланс 1 15.04.2009 19:27
Как сохранить нарисованный график в JPG файл Ark Мультимедиа в Delphi 13 03.04.2009 15:41
Не могу открыть файл из-за размера! Ольга198 Microsoft Office Word 4 21.02.2009 07:07