![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Всем привет, извините но знаю что подобных тем в инете много но я так и не смог найти решение. У меня задача. Нужно содержимое 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)
| ||