![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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)
| ||
|
#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
|
||||
|
||||
|
А кодировать во что-нибудь со сжатием религия не позволяет?
|
| Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Easy (30.05.2013)
| ||