Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateStreamOnHGlobal, загрузить jpg из массива байт 
:(
    Опции темы
Andrey44
Дата 22.6.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Всем доброго утра.
Вопрос в следующем:
У меня есть набор байт - это картинка jpg которую я загружаю в массив из БД
Потом мне эту картинку надо отобразить в окне, но что-то никак не могу это сделать.
Вот код создания картинки из массива байт:
Код

CByteArray byteArr;
    olevar.GetByteArrayFromVariantArray(byteArr);

    //BYTE *data = byteArr.GetData();


    Gdiplus::Status st;
    INT_PTR imageSize = byteArr.GetSize();
    if (!imageSize)
        return;
    const void* pResourceData = byteArr.GetData();
    if (!pResourceData)
        return;
    HGLOBAL hBuffer  = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
    if (hBuffer)
    {
        void* pBuffer = ::GlobalLock(hBuffer);
        if (pBuffer)
        {
            CopyMemory(pBuffer, pResourceData, imageSize);
            IStream* pStream = NULL;
            if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
            {
                _img = Gdiplus::Image::FromStream(pStream);
                st = _img->GetLastStatus();//тут всегда invalidParameter
            }
            ::GlobalUnlock(hBuffer);
        }
        ::GlobalFree(hBuffer);
        hBuffer = NULL;
    }

    Invalidate();

Подскажите, что не так делаю?
Убил уже 2 часа времени и никак smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 22.6.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Все перепроверил, и получилось что не правильно читал и записывал байты в БД.
Читал файл:
Код

std::ifstream inFile(path);

    if(inFile == 0)return;
    inFile.seekg (0, std::ios::end);
    __int64 sizefile = inFile.tellg();
    inFile.seekg (0, std::ios::beg);
    
    byteArr.SetSize(sizefile);
    BYTE *data = byteArr.GetData();

    inFile.read(
        (char*)data, // буффер
        (UINT)sizefile);    // количество читаемых в буфер байт

    inFile.close();
Но так читались не все байты, и почти весь byteArr записывался нулями.
Теперь читаю:
Код

    CStdioFile f(path, CFile::modeRead);
    __int64 sizefile = f.GetLength();

    byteArr.SetSize(sizefile);
    BYTE *data = byteArr.GetData();

    f.Read(data, sizefile);
    f.Close();
Читаются вроде как все байты, но при сохранении в картинку получается что байты или смещаются или что-то не так.
Вот две картинки:
1)до сохранения
user posted image
2)после
user posted image

Сохраняю картинку так:
Код

CStdioFile f(_T("D:\\testImage.bmp"), CFile::modeWrite | CFile::modeCreate);
    f.Write(byteArr.GetData(), imageSize);
    f.Close();

Что делать, как читать и писать? smile 

Это сообщение отредактировал(а) Andrey44 - 22.6.2009, 12:29


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 22.6.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



С записью и чтением разобрался.
Надо было добавить флаг
Код

CFile::typeBinary

Теперь картинка получается как она должна быть, но теперь не могу нарисовать картинку.
Как из массива байт получить картинку Gdiplus::Image?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 23.6.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



 smile Ну неужели никто никогда не делал такого?
Если сохранить массив байтов в файл и открыть его , то получается нормальная картинка, 
НО мне надо без сохранения в файл. Как из массива байтов получить Gdiplus::Image ???


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
jonie
Дата 23.6.2009, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



http://www.eggheadcafe.com/forumarchives/w...ost25116322.asp
зачитай-ка.
ну и вообще гугл - трабла-то стандартная должно быть.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Andrey44
Дата 23.6.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



jonie, спасибо за помощь, уже разобрался.
Я освобождал память ::GlobalFree(hBuffer);, а картинка думала что с памятью у нее все нормально smile , а ее уже не было.
Теперь переписал ::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) на 
::CreateStreamOnHGlobal(hBuffer, TRUE, &pStream), теперь память освобождается когда картинка умирает.
А я столько времени потратил!


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.