Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2012, 15:45   #1
Tony.
Пользователь
 
Регистрация: 14.06.2012
Сообщений: 13
По умолчанию Из Base64 в изображение

Здравствуйте столкнулся с проблемой расшифровал текст и получил
Код:
/9j/4AAQSkZJRgABAQAAAQABAAD/..........oYc4IB5596zbtuNaluiiiqA/9m=
погуглив выяснил что это Base64 кодировка, в этой строке заключено изображение нашел вариант для просмотра через Html
Код HTML:
<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/..........oYc4IB5596zbtuNaluiiiqA/9m=" alt="" />
</body>
браузер открывает изображение, но мне необходимо преобразовать этот код в делфи и открыть его в image. Помогите пожалуйста.

Последний раз редактировалось Tony.; 14.06.2012 в 16:02.
Tony. вне форума Ответить с цитированием
Старый 14.06.2012, 16:18   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

EncodeBase64 или base64encode в гугле
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.06.2012, 16:22   #3
Tony.
Пользователь
 
Регистрация: 14.06.2012
Сообщений: 13
По умолчанию

я сталкивался с DecodeBase64() но как мне загрузить все это в компонент Timage? Использую(писал не сам):
Код:
function DecodeBase64(Value: String): String;
const b64alphabet: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  function DecodeChunk(const Chunk: String): String;
  var
    W: LongWord;
    i: Byte;
  begin
    W := 0; Result := '';
    for i := 1 to 4 do
      if Pos(Chunk[i], b64alphabet) <> 0 then
        W := W + Word((Pos(Chunk[i], b64alphabet) - 1)) shl ((4 - i) * 6);
    for i := 1 to 3 do
      Result := Result + Chr(W shr ((3 - i) * 8) and $ff);
  end;
begin
  Result := '';
  if Length(Value) mod 4 <> 0 then Exit;
  while Length(Value) > 0 do
  begin
    Result := Result + DecodeChunk(Copy(Value, 0, 4));
    Delete(Value, 1, 4);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);

begin
memo2.text:=DecodeBase64(memo1.Text);
end;
В memo1 записан код картинки зашифрованный в base64

Последний раз редактировалось Tony.; 14.06.2012 в 16:25.
Tony. вне форума Ответить с цитированием
Старый 14.06.2012, 16:29   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

юнит EncdDecd в D7, функция DecodeStream из Stream в Stream, от туда нет проблем в Image
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.06.2012, 17:04   #5
Tony.
Пользователь
 
Регистрация: 14.06.2012
Сообщений: 13
По умолчанию

Нашел пример, все работает изображение успешно сохраняется в файле и его можно просмотреть через просмотр фотографий windows
Код:
uses EncdDecd;
procedure TForm1.Button2Click(Sender: TObject);
var
st,st2:TMemoryStream;
s:string;
begin
st:=TMemorystream.Create;
st2:=TMemorystream.Create;
s:=memo1.Text;
st.WriteBuffer(s[1],Length(s)*SizeOf(Char));
st.Position:=0;
DecodeStream(st,st2);
st2.SaveToFile('image.bmp');
st.Free; st2.Free;
end;
но когда я пытаюсь загрузить его в image
Код:
image1.Picture.LoadFromFile('image.bmp');
или же просто через инспектор то выдает ошибку "Bitmap image is not valid."
Так же пробовал программно
Код:
image1.Picture.Bitmap.LoadFromStream(st2);
ничего не происходит

Последний раз редактировалось Tony.; 14.06.2012 в 17:10.
Tony. вне форума Ответить с цитированием
Старый 14.06.2012, 17:18   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
<img src="data:image/jpeg;
Это не bitmap, а jpeg.
Посмотрите hex редактором, что записано в файле.

Если посмотреть блокнотом, то JPEG начинается так:
Цитата:
яШяа JFIF
А BITMAP так:
Код:
BMцЖ
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.06.2012 в 17:21.
BDA вне форума Ответить с цитированием
Старый 14.06.2012, 17:19   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А image1.Picture.Bitmap.LoadFromFile?

Цитата:
Это не bitmap, а jpeg
Точно, проглядел. Jpeg в uses
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.06.2012 в 17:22.
Аватар вне форума Ответить с цитированием
Старый 14.06.2012, 17:23   #8
Tony.
Пользователь
 
Регистрация: 14.06.2012
Сообщений: 13
По умолчанию

Сохраняется с разрешением *.bmp и *.jpg оба варианта работают
Код:
image1.Picture.LoadFromFile('image.jpg');
работает, но если затрагивать ту же картинку сохраненную с разрешением *.bmp то выдает "Bitmap image is not valid." И мне необходимо чтобы картинка вообще не сохранялась, чтобы на прямую загружалась из кода в Timage.
Код:
image1.Picture.Bitmap.LoadFromStream(st2);
не работает. Вот есть у меня раскодированное изображение в памяти "st2" загрузить в timage и освободить. Изображение в "st2" есть так как при
Код:
st2.SaveToFile('image.jpg');
оно сохраняется.

Последний раз редактировалось Tony.; 14.06.2012 в 17:26.
Tony. вне форума Ответить с цитированием
Старый 14.06.2012, 17:26   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

st2.Position:=0 перед LoadFromStream
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.06.2012, 17:32   #10
Tony.
Пользователь
 
Регистрация: 14.06.2012
Сообщений: 13
По умолчанию

Все работает правильно пока не доходит до загрузки изображения из памяти
Код:
uses EncdDecd;
procedure TForm1.Button2Click(Sender: TObject);
var
st,st2:TMemoryStream;
s:string;
begin
st:=TMemorystream.Create;
st2:=TMemorystream.Create;
s:=memo1.Text;
st.WriteBuffer(s[1],Length(s)*SizeOf(Char));
st.Position:=0;
DecodeStream(st,st2);
st2.Position:=0;
image1.Picture.Bitmap.LoadFromStream(st2);
st.Free; st2.Free;
end;
где выдает ошибку "Bitmap image is not valid." эту же ошибку выдает когда я пытаюсь через инспектор загрузить изображение в image, может дело в самом изображении? Потому что другие *.bmp загружаются нормально
Tony. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изображение в base64 wowsel Мультимедиа в Delphi 4 16.05.2012 15:39
Base64 GoldmasteR Общие вопросы Delphi 10 06.01.2011 18:37
base64 beemoto Общие вопросы Delphi 0 24.04.2010 21:58
base64 Dimarik Win Api 0 10.04.2010 18:59
base64 BlackOmen Общие вопросы Delphi 2 02.05.2008 16:30