![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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)
  | ||