|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
содержимое 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; Код:
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; 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; ну вот. это конечно не все что я пробовал. просто остальные вкладки закрыл уже. помогите пожалуйста уже третий день мучаюсь. решил вот у вас спросить. Последний раз редактировалось Easy, 27.05.2013 в 20:57. |
#2
|
|||
|
|||
TMemoryStream и TStringStream могут помочь.
Сохраняешь картинку в TMemoryStream, потом запаковываешь через Base64, например, и сохраняешь в TStringStream. Ну и уже строку из TStringStream пересылаешь. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Easy (28.05.2013)
|
#3
|
|||
|
|||
хорошо. спасибо, сейчас попробую. допустим у меня получится. а как потом обратно из той строки что получится сделать картинку?
|
#4
|
|||
|
|||
ну вот как я и думал. кодировать получается, а декодировать нет, к сожалению. помогите пожалуйста...
кодирую Код:
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
|
|||
|
|||
переделал функцию декодирования вот так
Код:
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; |
#6
|
||||
|
||||
Цитата:
В твоём случае наверно вместо DecodeBase64 лучше использовать DecodeString или DecodeStream. |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Easy (28.05.2013)
|
#7
|
|||
|
|||
ничего не получается...
|
#8
|
||||
|
||||
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Easy (30.05.2013)
|
#9
|
|||
|
|||
нет, не работает. программа колом встает. и нагрузку на систему 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; вот такой Цитата:
Код:
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
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Easy (30.05.2013)
|
#11
|
|||
|
|||
работает. но если картинка маленькая. но у меня же картинки будут по 3 метра в среднем. и система может быть слабая.
Последний раз редактировалось Easy, 30.05.2013 в 14:56. |
#12
|
|||
|
|||
например скрин с монитора. весит 3.5 где то метров.
|
#13
|
||||
|
||||
открыл 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
|
|||
|
|||
а ты вот попробуй.
Код:
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 |
#15
|
||||
|
||||
А кодировать во что-нибудь со сжатием религия не позволяет?
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Easy (30.05.2013)
|