Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача картинки по UDP одним пакетом 
V
    Опции темы
Max_Rendel
Дата 10.5.2008, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.2.2007
Где: г.Благовещенск

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



Поправте пожалуйста!
Задумка: По нажатию кнопки, клиент предаёт картинку серверу одним пакетом (!!!обязательно не сохраняя её предварительно на диске!!! размер картинки от 3кб до 20кб), после принятия картинки сервер помещает её в Image1.


Вот клиент:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  TM: TMemoryStream;
  jpg: TJPEGImage;
begin
  TM := TMemoryStream.Create;
  jpg := TJPEGImage.Create;

  jpg.Assign(Image1.Picture.Bitmap);
  jpg.CompressionQuality := 10;
  jpg.Compress;
  jpg.SaveToStream(TM);
  jpg.free;

  IdUDPClient1.SendBuffer(TM, TM.Size);

  TM.Free;
end;


Вот сервер:
Код

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  TM: TMemoryStream;
  jpg: TJPEGImage;
begin
  TM := TMemoryStream.Create;
  jpg := TJPEGImage.Create;

  if AData.Size > 0 then
  begin
    TM.CopyFrom(AData, AData.Size);

    jpg.LoadFromStream(TM);

    image1.Picture.Graphic := jpg;
  end;

  TM.Free;
  jpg.free;
end;


На сервре выскакиает ошибка: JPEG error #42

Что я делаю не так? smile 
PM MAIL   Вверх
Exai1e
Дата 11.5.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а размер посланный и принятый сверял ?
мб теряется заголовок

Добавлено @ 16:07
попробуй сохранить принятые данные в стим/фаил и открыть win средствами

Это сообщение отредактировал(а) Exai1e - 11.5.2008, 16:07


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Max_Rendel
Дата 12.5.2008, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.2.2007
Где: г.Благовещенск

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



Exai1e, да размер замерял перед отправкой и после. Самое интересное, что всё в порядке...
Пробывал сохранять в TFileStream (на диск), его размер 0.


Может что не так с отправкой и приёмом делаю?????? smile 
Может каким другим способом сделать???? Но без сохранения файла на диск!
PM MAIL   Вверх
MetalFan
Дата 12.5.2008, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



1. какой компонент для UDP пользуется?
2.
Цитата(Max_Rendel @  10.5.2008,  09:17 Найти цитируемый пост)
if AData.Size > 0 then
  begin
    TM.CopyFrom(AData, AData.Size);
    jpg.LoadFromStream™;
    image1.Picture.Graphic := jpg;
  end;

Цитата(Max_Rendel @  12.5.2008,  02:05 Найти цитируемый пост)
Пробывал сохранять в TFileStream (на диск), его размер 0.

что-то не совсем совместимо утверждение....

попробуй после CopyFrom перед загрузкой в jpg сделать Seek( 0, soFromBeginning )

Добавлено через 43 секунды
что-то сомнение берет, что под буфером подразумевается TStream
Цитата(Max_Rendel @  10.5.2008,  09:17 Найти цитируемый пост)
IdUDPClient1.SendBuffer(TM, TM.Size);




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Max_Rendel
Дата 12.5.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.2.2007
Где: г.Благовещенск

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



MetalFan,

1) Indy (кот. по умолчанию стоит в Delphi7)

2) 
Цитата(MetalFan @  12.5.2008,  13:58 Найти цитируемый пост)
что-то не совсем совместимо утверждение....


не понял замечания???? Поподробней пожалуйста…

3)
Цитата(MetalFan @  12.5.2008,  13:58 Найти цитируемый пост)
попробуй после CopyFrom перед загрузкой в jpg сделать Seek( 0, soFromBeginning )

Пробывал делать так после сохранения в стрим:
Код

TM.Position := 0;

4) 
Цитата(MetalFan @  12.5.2008,  13:58 Найти цитируемый пост)
что-то сомнение берет, что под буфером подразумевается TStream

Тогда что????
PM MAIL   Вверх
ksili
Дата 12.5.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Может между
Код

  IdUDPClient1.SendBuffer(TM, TM.Size);

и
Код

  TM.Free;

надо сделать задержку? А-то оно ещё отправляется, а вы его сразу удаляете...


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Max_Rendel
Дата 12.5.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.2.2007
Где: г.Благовещенск

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



ksili сделал, и не чего не поменялось.

Я уже немного изменил вид кода и избавился от JPG (пока не разберусь), вместо него отправляю маленький Bitmap.

Вот как он выглядит:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  TM: TMemoryStream;
begin
  TM := TMemoryStream.Create;

  Image1.Picture.Bitmap.SaveToStream(TM);
  TM.Position := 0;

  Label1.Caption := IntToStr(TM.Size);

  IdUDPClient1.SendBuffer(TM, TM.Size);

  Sleep(500);
  TM.Free;
end;

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  TM: TMemoryStream;
begin
  TM := TMemoryStream.Create;

  if AData.Size > 0 then
  begin
    TM.CopyFrom(AData, AData.Size);

    Label2.Caption := IntToStr(TM.Size);

    Image2.Picture.Bitmap.LoadFromStream(TM);
    Image2.Refresh;
  end;

  Sleep(500);
  TM.Free;
end;


Ошибка больше не вылетает, но Image всё равно не отображает картинку.
Но пока всё без результатно...
  smile 
PM MAIL   Вверх
ksili
Дата 12.5.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



TM.Size в клиенте и в сервере одинаковый?

Добавлено через 34 секунды
А это всё на одном компе происходит?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Max_Rendel
Дата 12.5.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.2.2007
Где: г.Благовещенск

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



Цитата(ksili @  12.5.2008,  17:47 Найти цитируемый пост)
TM.Size в клиенте и в сервере одинаковый?

Да.

Цитата(ksili @  12.5.2008,  17:47 Найти цитируемый пост)
А это всё на одном компе происходит?

Для отладки я сделал всё в одной проге, но пробывал и на сервер - клиент.
PM MAIL   Вверх
ksili
Дата 12.5.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



А проверял в TMemoryStream->Memory и AData именно байты твоей картинки после чтения? можно проверить несколько первых байт.

Может ещё попробовать использовать не метод UDPRead, а событие OnUDPRead?

Добавлено @ 12:20
С потоками ещё вроде такой косяк, что нулевой байт считается концом потока (а в BMP это просто чёрный цвет). Так что может быть при загрузке
Код

Image2.Picture.Bitmap.LoadFromStream(TM);

до конца не грузится из-за того, что встречается именно такой байт. Тогда надо будет грузить не так, а копируя блок памяти, например при помощи memcpy. Только не забудь тогда выделить вручную память под Image2.Picture.Bitmap.

Это сообщение отредактировал(а) ksili - 12.5.2008, 12:31


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 12.5.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Кстати, до чтения картинки, размеры Image2 не нулевые случайно? Если так, то возможно придётся вручную выставлять размеры его канвы, а возможно и самого битмапа


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Max_Rendel
Дата 12.5.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.2.2007
Где: г.Благовещенск

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



Цитата(ksili @  12.5.2008,  18:15 Найти цитируемый пост)
Может ещё попробовать использовать не метод UDPRead, а событие OnUDPRead?

Это как?
PM MAIL   Вверх
MetalFan
Дата 12.5.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Max_Rendel @  12.5.2008,  11:05 Найти цитируемый пост)
Indy (кот. по умолчанию стоит в Delphi7)

так там багов выше крыши. скачай и поставь по-свежее.

Добавлено через 6 минут и 34 секунды
Цитата(Max_Rendel @  12.5.2008,  11:05 Найти цитируемый пост)
не понял замечания???? Поподробней пожалуйста…

ты говоришь, что выскакивает jpeg error, т.е. выполняется приведенная мной венка твоего кода
но при сохранении в файл размер 0. значит не так сохраняешь.

Цитата(Max_Rendel @  12.5.2008,  11:05 Найти цитируемый пост)
Тогда что???? 

не знаю что там было в древних индейцах, но наверняка не TStream


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Max_Rendel
Дата 13.5.2008, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.2.2007
Где: г.Благовещенск

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



У кого не будь есть пример отправки по UDP файла без предварительного сохранения на диск???????
(в любой версии Indy, только укажите её)

PLZ
 smile 
А товсем нечего не получается......  smile 
PM MAIL   Вверх
Max_Rendel
Дата 14.5.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 24.2.2007
Где: г.Благовещенск

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



Ну вроде дела сдвинулись.  smile 
Но опять же с проблемами…
Вот код:


Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Msg: String;
begin
  Msg := String(Image1.Picture.Bitmap);

  IdUDPClient1.Send(Msg);
end;

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  Msg: String;
begin
  if AData.Size > 0 then
  begin
    SetLength(Msg, AData.Size);
    AData.ReadBuffer(Msg[1], Length(Msg));

    Image2.Picture.Bitmap := TBitmap(Msg);
  end;
end;


Всё работает, но в этой программе и сервер и клиент находятся на одной форме, т.е. в одной программа. А когда я делаю отдельно сервер и клиент, те ничего не работает. На сервере выскакивает ошибка (Вот она http://ipicture.ru/uploads/080514/gxtqW9itSY.jpg), в тот момент когда я начинаю грузить принятые данные в Image2.

Код

Image2.Picture.Bitmap := TBitmap(Msg);


Замерял размер до отправки и после, всё OK. Проверял побайтно, всё OK.
Что я не так делаю?????
  smile 

Это сообщение отредактировал(а) Max_Rendel - 14.5.2008, 12:48
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

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


 




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


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

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