Форум по 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,057
Версия 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)
  #7  
Старый 29.05.2013, 22:04
Easy Easy вне форума
Прохожий
 
Регистрация: 26.05.2013
Сообщения: 11
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

ничего не получается...
Ответить с цитированием
  #8  
Старый 30.05.2013, 09:04
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а это работает?
http://zalil.ru/34542401
открывать только .bmp!!!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Easy (30.05.2013)
  #9  
Старый 30.05.2013, 13:27
Easy Easy вне форума
Прохожий
 
Регистрация: 26.05.2013
Сообщения: 11
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

нет, не работает. программа колом встает. и нагрузку на систему 99% выдает.
вот у меня вот этот код
Код:
function TForm1.EncodeFile(): AnsiString;
begin
  stream := TMemoryStream.Create;
  try
    bmp.SaveToStream(stream);
    result := EncodeBase64(stream.Memory, stream.Size);
    memo1.Text:= result;
  Except
    on E : Exception do
   ShowMessage(E.ClassName+' ошибка с сообщением : '+E.Message);
  end;

    stream.Free;
    Bmp.Free;

end;
вроде кодирует. не могу сказать точно. но в memo загружается текст.
вот такой
Цитата:
Qk1mMjwAAAAAADYAAAAoAAAAVgUAANICAAABACAAAAAAADAyPA AAAAAAAAAAAAAAAAAAAAAASGQZ
ACdiIQAuZCAANGYhADhnIAA5cCAANG8gACxuIAAobB4AJGwdAC RuHwAmbB8AKG8fAC1vHwAsbR8A
LW4hAClvHgArbR0AJmwiACptHgAwcSQAMG8kADBvJAAxciUANH EkADNwJAA+dCUAQHUnAEN1JgBE
dSYARXcmAEB0KAA+dScAPnQlADpyJgA4dCYAOnUnAD5zLAA8dC wAPXQqADtzKgA7ciwAOnQsADp0
LQA5dSoAOXMsADlyKwA4cioAOXErADdyKgA4cioAOHMrAD1zLg A8czAAPnMwAD5yMAA8cjAAPXEv
ADxyLgA8cTAAPXMwAD5yMAA9cjAAPnEuAD9yMQA/czEAPnMwAD5yMwA+cTEAQHMxAD1xMQA+cjAA
PnMxAD9yMQBAczEAQ3QwAEN1MgBFdy8AR3UwAEZ0MgBFdi8AR3 UwAEJzKwBCdS0AP3QrAD9rKwA9
aioAPWkqADNnIQAzZiIAMmUiADhjIQDjcisA4m4qANZbIgClQR kApUEZAKVBGQClQRkApUEZAKVB
но декодировать это не получается. а еще и нужно из этого картинку сделать. пытаюсь вот так
Код:
function TForm1.DecodeFile(): AnsiString;
var
ss: TStringStream;
begin
  stream := TMemoryStream.Create;
  ss:= TStringStream.Create('');
  bmp:= TBitMap.Create;
  try
  memo1.Lines.SaveToStream(ss);
  //ss.Seek(0,0);
  //stream.CopyFrom(ss, ss.Size);
  DecodeStream(ss, stream);
  bmp.LoadFromStream(stream);
  image2.picture.assign(bmp)
 Except
    on E : Exception do
    ShowMessage(E.ClassName+' ошибка с сообщением : '+E.Message);
  end;

    stream.Free;
    Bmp.Free;
    ss.Free;




end;
по нажатию на кнопку вызываю функцию. но ничего не происходит...

Последний раз редактировалось Easy, 30.05.2013 в 13:37.
Ответить с цитированием
  #10  
Старый 30.05.2013, 14:29
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Easy
программа колом встает. и нагрузку на систему 99% выдает.
это она кодирует долго большие изображения. i E6800 (2 cores) 640*480*8bpp bmp 300КБ кодирует 55 сек. и 50% загрузки. на i7 сейчас нет возможности проверить. попробуй поменьше картинки для теста.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Easy (30.05.2013)
  #11  
Старый 30.05.2013, 14:51
Easy Easy вне форума
Прохожий
 
Регистрация: 26.05.2013
Сообщения: 11
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

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

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

например скрин с монитора. весит 3.5 где то метров.
Ответить с цитированием
  #13  
Старый 30.05.2013, 15:13
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

открыл 1280*1024*24bpp 3,75МБ, курил 5 минут, результата не дождался
использовал http://tangram-plugin-framework.goog...64EncdDecd.pas

Код:
procedure EncodeStream(Input, Output: TStream);
procedure DecodeStream(Input, Output: TStream);
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Easy (30.05.2013)
  #14  
Старый 30.05.2013, 17:07
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;
  Except
    on E : Exception do
   ShowMessage(E.ClassName+' ошибка с сообщением : '+E.Message);
  end;
 
    stream.Free;
    Bmp.Free;
 
end;
в одну кнопку выполнение этой функции а в другую вот этот код
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  bmp:=TBitmap.Create;
  bmp.Height:=Screen.Height;
  bmp.Width:=Screen.Width;
  DC:=GetDC(0);  //дескриптор экрана
  BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
  DC, 0, 0, SRCCOPY);
  Image1.Picture.Assign(bmp);
  ReleaseDC(0, DC);


end;
ну и глобальные переменные
Код:
var
  Form1: TForm1;
  bmp: TBitmap;
DC: HDC;
   stream: TMemoryStream;

implementation
и кинь на форму TImage и Memo не забудь
Ответить с цитированием
  #15  
Старый 30.05.2013, 17:37
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А кодировать во что-нибудь со сжатием религия не позволяет?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
Easy (30.05.2013)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter