Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как CImage передать по сети? 
V
    Опции темы
yurec
Дата 13.1.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 4.7.2007

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



Привет!

Стоит задача передавать по сети изображения ( примерно 30 джпегов  по 200-300кб в секунду ).
Хочеться ето сделать еффективно и красиво.
Вот думаю над таким вариантом:

Код


//Save

{
    CSocket sockSrvr;
    sockSrvr.Create(9999,SOCK_STREAM,_T("127.0.0.1"));
    sockSrvr.Listen();

    CSocket sockRecv; 
    sockSrvr.Accept( sockRecv ); 

    CSocketFile file(&sockRecv);
    CArchive ar(&file,CArchive::store);
    CArchiveStream stream(&ar);
    CImage img;
    HRESULT hr_res = img.Load(_T("D:\\Documents and Settings\\zhacun\\Desktop\\CreateImagesTest\\clock01.jpg"));
    if (S_OK != hr_res)
      {
      DWORD err = GetLastError();
      ASSERT(FALSE);
      }

    hr_res = img.Save(&stream,Gdiplus::ImageFormatJPEG);
    if (S_OK != hr_res)
      {
      DWORD err = GetLastError();
      ASSERT(FALSE);
      }
 }



Код


//Load

{
  CSocket sock;
  sock.Create();
  UINT res = sock.Connect(_T("127.0.0.1"),9999);
  if (0 == res)
    {
    DWORD nError = GetLastError();
    ASSERT(FALSE);
    }

  CSocketFile file(&sock);
  CArchive ar(&file,CArchive::load);
  CArchiveStream stream(&ar);
  CImage img;

  HRESULT hr_res = img.Load(&stream);//go into gdiplusbitmap.h next
  if (E_FAIL == hr_res)
    {
    DWORD err = GetLastError();
    ASSERT(FALSE);
    }
 }

//gdiplusbitmap.h

inline 
Bitmap::Bitmap(
    IN IStream *stream, 
    IN BOOL useEmbeddedColorManagement
    )
{
    GpBitmap *bitmap = NULL;

    if(useEmbeddedColorManagement)
    {
        lastResult = DllExports::GdipCreateBitmapFromStreamICM(stream, &bitmap);
    }
    else
    {
        lastResult = DllExports::GdipCreateBitmapFromStream(stream, &bitmap); 
    //returns invalidParameter here, output tells: "Warning - Attempt made to seek on a CSocketFile"
    }

    SetNativeImage(bitmap);
}




Подскажите в чём проблема, пожалуйста. Или предложите альтернативу. 

Спасибо.
PM MAIL   Вверх
Rapalex
Дата 13.1.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



По моему пересжимать каждый файл перед отправкой както не красиво, и ресурсоёмко, так ещё и с потерями, получится так что посылается один файл а приходит другой, зато очень похожий )))


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
yurec
Дата 13.1.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 4.7.2007

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



проблема,которую мне нужно решить - CImage::Load  не читает из потока созданого из сокета.

(про какое сжатие Вы говорите не знаю, да ето и не имеет значения в етом случае)
PM MAIL   Вверх
yurec
Дата 13.1.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 4.7.2007

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



Вот так работает! 

Код

// TODO: Add your control notification handler code here
  {
  CSocket sock;
  sock.Create();
  UINT res = sock.Connect(_T("127.0.0.1"),9999);
  if (0 == res)
    {
    DWORD nError = GetLastError();
    ASSERT(FALSE);
    }

  CSocketFile file(&sock);
  CArchive ar(&file,CArchive::load);
  CArchiveStream stream(&ar);

  const ULONG buf_size = 4 * 1024 * 1024;

  COleStreamFile ole_file;
  ole_file.CreateMemoryStream();
  char * p_buf = new char[buf_size];
  ZeroMemory(p_buf,buf_size);

  ULONG read_stream = 0;
  HRESULT hr = stream.Read(p_buf,buf_size,&read_stream);
  ASSERT(S_OK == hr);
  ole_file.Write(p_buf,read_stream);

  HRESULT hr_res = img.Load(ole_file.GetStream());
  VERIFY(S_OK == hr_res);

  delete[] p_buf;
  }


Надеюсь я не ошибаюсь и COleStreamFile выделяет память в оперативке, а не на диске?
PM MAIL   Вверх
yurec
Дата 14.1.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 4.7.2007

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



Я думаю, что я не ошибаюсь )
PM MAIL   Вверх
Rapalex
Дата 14.1.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Лучше бы ты весь файл передал массивом байт, это было бы правильней.


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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