Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.05.2013, 20:55
Easy Easy вне форума
Прохожий
 
Регистрация: 26.05.2013
Сообщения: 11
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию содержимое BitMap в массив и обратно делфи

Всем привет, извините но знаю что подобных тем в инете много но я так и не смог найти решение. У меня задача. Нужно содержимое Bitmap отправить по почте, но не создавать никаких файлов на компе. Т.е. нужно картинку из Bitmap как то преобразовать в стринг, наверное, и отправить. Чтобы потом на другом компе эту картинку просмотреть в компоненте TImage, к примеру. воот. я много попробовал сейчас несколько примеров кода выложу и расскажу что не так.
1.
Код:
for i := 0 to Image1.Height - 1 do
  begin
      for j := 0 to Image1.Width - 1 do
        begin
          Color := Image1.Canvas.Pixels[j, i];
            // Получаем составляющие цвета
          R := GetRValue(Color);
          G := GetGValue(Color);
          B := GetBValue(Color);
            // Теперь делаем с ними, что надо. Например, сохраняем в массив.
        end;
  end;
нашел код на каком то сайте. но вот только не могу понять как он работает, потому что не должен он ничего сохранить кроме последнего пикселя. я конечно попробовал закрасить TImage. но либо вся форма становилась черной, либо красной.
Код:
for i := 0 to Image2.Height - 1 do
 begin
      for j := 0 to Image2.Width - 1 do
        begin
           // Получаем составляющие цвета

         Image2.Canvas.Pixels[j, i]:= r;

         Image2.Canvas.Pixels[j, i]:= g;

         Image2.Canvas.Pixels[j, i]:= b;
            // Теперь делаем с ними, что надо. Например, сохраняем в массив.
        end;
воот. это не получилось. я вот подумал может значения цветов R G и B сохранять в массив. но вот только не смог сообразить как мне массив сделать и как потом из массива все это в картинку превратить.
2.
Код:
var
  a:    array of TRGBTriple;
  bmp:  TBitMap;
  size: dword;
begin
  bmp:=TBitMap.Create;
  bmp.LoadFromFile( 'c:\1.bmp' );
  size:=bmp.Width*bmp.Height;
  Setlength(a,size);
  GetBitmapBits(bmp.Handle,size*3,a);
// теперь вся картинка в одномерном массиве a
end;
ну тут трудно сказать. я вообще не знаю как после этого вывести все что там в массиве в TImage. Если этот код все таки работает как нужно то может подскажите как мне после отправить значения массива по почте и потом отбразить их. я тут не смог разобраться потому что тип массива интересный.
ну вот. это конечно не все что я пробовал. просто остальные вкладки закрыл уже. помогите пожалуйста уже третий день мучаюсь. решил вот у вас спросить.

Последний раз редактировалось Easy, 27.05.2013 в 20:57.
Ответить с цитированием
  #2  
Старый 27.05.2013, 21:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

TMemoryStream и TStringStream могут помочь.
Сохраняешь картинку в TMemoryStream, потом запаковываешь через Base64, например, и сохраняешь в TStringStream. Ну и уже строку из TStringStream пересылаешь.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Easy (28.05.2013)
  #3  
Старый 28.05.2013, 11:33
Easy Easy вне форума
Прохожий
 
Регистрация: 26.05.2013
Сообщения: 11
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

хорошо. спасибо, сейчас попробую. допустим у меня получится. а как потом обратно из той строки что получится сделать картинку?
Ответить с цитированием
  #4  
Старый 28.05.2013, 15:39
Easy Easy вне форума
Прохожий
 
Регистрация: 26.05.2013
Сообщения: 11
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

ну вот как я и думал. кодировать получается, а декодировать нет, к сожалению. помогите пожалуйста...
кодирую
Код:
function TForm1.EncodeFile(): AnsiString;
begin
  stream := TMemoryStream.Create;
  try
    bmp.SaveToStream(stream);
    result := EncodeBase64(stream.Memory, stream.Size);
    memo1.Text:= result;//строка 94
  finally
    stream.Free;
    Bmp.Free;
  end;
end;
потом пытаюсь декодировать но что то у меня с типами данных не сходится
Код:
function TForm1.DecodeFile(): TBytes;
begin
  stream := TMemoryStream.Create;
  bmp:= TBitMap.Create;
  try
    Memo1.Lines.SaveToStream(stream);

    bmp.LoadFromStream(DecodeBase64(stream.Memory, stream.Size);// строка 79
    image2.Assign(bmp);
  finally
    stream.Free;
    Bmp.Free;
  end;

end;
ошибки
Код:
[DCC Error] Unit1.pas(79): E2010 Incompatible types: 'AnsiString' and 'Pointer'

[DCC Error] Unit1.pas(79): E2010 Incompatible types: 'TStream' and 'TBytes'

[DCC Warning] Unit1.pas(94): W1057 Implicit string cast from 'AnsiString' to 'string'
Ответить с цитированием
  #5  
Старый 28.05.2013, 16:11
Easy Easy вне форума
Прохожий
 
Регистрация: 26.05.2013
Сообщения: 11
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

переделал функцию декодирования вот так
Код:
function TForm1.DecodeFile(): AnsiString;
var
ss: TStringStream;
begin
  stream := TMemoryStream.Create;
  ss:= TStringStream.Create('');
  bmp:= TBitMap.Create;
  try
  result:= memo1.Text;
  DecodeBase64(result);
  ss.WriteString(result);
  ss.Seek(0,0);
  stream.CopyFrom(ss, ss.Size);
  bmp.LoadFromStream(stream);
  image2.picture.assign(bmp)
  finally
    stream.Free;
    Bmp.Free;
    ss.Free;
  end;

end;
все запускается. но в image2 ничего не отображается
Ответить с цитированием
  #6  
Старый 28.05.2013, 16:52
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Easy
переделал функцию декодирования вот так
Код:
function TForm1.DecodeFile(): AnsiString;
var
ss: TStringStream;
begin
  stream := TMemoryStream.Create;
  ss:= TStringStream.Create('');
  bmp:= TBitMap.Create;
  try
  result:= memo1.Text;
  DecodeBase64(result);
  ss.WriteString(result);
  ss.Seek(0,0);
  stream.CopyFrom(ss, ss.Size);
  bmp.LoadFromStream(stream);
  image2.picture.assign(bmp)
  finally
    stream.Free;
    Bmp.Free;
    ss.Free;
  end;

end;
все запускается. но в image2 ничего не отображается
Вообще-то DecodeBase64 это не процедура, а функция которая возвращает результат, который ты не используешь и поэтому ничего не отображается в image2.
В твоём случае наверно вместо DecodeBase64 лучше использовать DecodeString или DecodeStream.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Easy (28.05.2013)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:45.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025