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