Здравствуйте, vlademar, Вы писали:
V>Скорее всего, этот вопрос уже задавался, но я не сумел найти на него ответ...
V>Как стандартными средствами Windows загрузить картинку в формате JPG/GIF/BMP из файла в массив? Ведь должна же быть какая-то встроенная библиотека...
Картинка представляет из себя такую схему:
|хеадер|данные|
тебе достаточно прочитать файл и дернуть данные и хедер.
Здравствуйте, vlademar, Вы писали:
V>Скорее всего, этот вопрос уже задавался, но я не сумел найти на него ответ...
V>Как стандартными средствами Windows загрузить картинку в формате JPG/GIF/BMP из файла в массив? Ведь должна же быть какая-то встроенная библиотека...
//////////////////////////////////////////////////////////////////////////
//
// Name: Class to load bitmaps from resources.
// Version: 1.0
// Date: 16-8-2006
// Author: masteryoda
//
//////////////////////////////////////////////////////////////////////////#pragma once
namespace WTL
{
class CResourceBitmap
{
public:
static HBITMAP Load(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID)
{
// TODO: may be need support for LoadEx & way to specify module
// to use resources from?
CResource res;
if (!res.Load(Type, ID))
return NULL;
// Create memory stream object an copy resource data to it.
CComPtr<IStream> stream;
HRESULT hr = ::CreateStreamOnHGlobal(NULL, TRUE, &stream);
if (FAILED(hr))
return NULL;
DWORD size = res.GetSize();
DWORD done;
hr = stream->Write(res.Lock(), size, &done);
if (FAILED(hr) || done != size)
return NULL;
LARGE_INTEGER pos = { 0, 0 };
hr = stream->Seek(pos, STREAM_SEEK_SET, NULL);
if (FAILED(hr))
return NULL;
// Load picture from memory.
CComPtr<IPicture> picture;
hr = ::OleLoadPicture(stream, 0, FALSE, IID_IPicture, (LPVOID*)&picture);
if (FAILED(hr))
return NULL;
// Get HBITMAP and make copy of it.
HBITMAP hBitmap;
hr = picture->get_Handle((OLE_HANDLE*)&hBitmap);
if (FAILED(hr))
return NULL;
return (HBITMAP)::CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, 0);
}
};
}
Код использует WTL, но это легко убирается (если нужно). Загрузка из файла — аналогично, см функцию OleLoadPicturePath
Здравствуйте, cod3r_200, Вы писали:
_>Картинка представляет из себя такую схему: _>|хеадер|данные| _>тебе достаточно прочитать файл и дернуть данные и хедер.
К сожалению, это не совсем то. Если для BMP это сработает, то в GIF и JPG данные хранятся в сжатом виде, причём возможны вариации алгоритмов их пожатия. Мне же в итоге нужна "чистая" картинка...
Здравствуйте, vlademar, Вы писали:
V>К сожалению, это не совсем то. Если для BMP это сработает, то в GIF и JPG данные хранятся в сжатом виде, причём возможны вариации алгоритмов их пожатия. Мне же в итоге нужна "чистая" картинка...
о, я вспомнил. Я с помощью CImage из набора ATL загружал эти все форматы. Работает на ура. Такой вариант пойдет?
Здравствуйте, vlademar, Вы писали:
V>Спасибо... Ещё бы понять, что здесь используется... Будьте добры, поясните буквально в двух словах, что такое WTL?
Здравствуйте, vlademar, Вы писали:
V>Здравствуйте, jedi, Вы писали:
J>>
J>>
J>>Код использует WTL, но это легко убирается (если нужно). Загрузка из файла — аналогично, см функцию OleLoadPicturePath
V>Спасибо... Ещё бы понять, что здесь используется... Будьте добры, поясните буквально в двух словах, что такое WTL?
Из WTL испоьзуется только класс CResource, который легко заменяется на вызовы FindResource/LoadResource/LockResource.
А в общем, идея тут простая, используемое АПИ ты увидел — есть желание — дерзай. На конкретные вопросы отвечу.
Здравствуйте, vlademar, Вы писали:
V>Скорее всего, этот вопрос уже задавался, но я не сумел найти на него ответ...
V>Как стандартными средствами Windows загрузить картинку в формате JPG/GIF/BMP из файла в массив? Ведь должна же быть какая-то встроенная библиотека...