Obrazek z bazy danych jako string

0

Czy wie ktoś z Was jak przekonwertować obrazek z **Byte **na String? Pobieram kwerendą wybrany obrazek z bazy danych i chcę go przesłać po TCP/IP. Pomyślałem, że najlepiej będzie przesłać go jako string i później dowolnym językiem przekonwertować go z powrotem z **Stringa **na Byte. P.S. Używam Turbo Delphi.

1

Zwyczajowo w stringu powinno trzymać się tekst - obrazek nim nie jest.
Dlaczego nie wyślesz obrazka jako danych binarnych (tablicy bajtów)?

0

Szczerze mówiąc przesłanie obrazka jako **String **było pierwszą myślą, niekoniecznie słuszną.
Aplikacją odbierająca tablicę bajtów jest napisana w C# i odpowiedź na Twoje pytanie jest prosta - niestety nie wiem jak to przesyłanie w Delphi napisać ;/

0

Dobre, ale to niestety nie mogę użyć. Chcę przesłać obrazek tak, aby kod po odebraniu można było przekonwetować na taki sam obrazek.

1

Tak jak napisał @vpiotr jeśli chcesz trzymać na polu stringa obrazek, to raczej trzeba go jakos zakodowac tak, aby nie mieć później problemów. Więc jakieś kodek typu base64, czy inne uuencode, ewentualnie w postaci heksow (to jeśli są to bardzo małe obrazki. Inne sposoby będą stwarzały tylko problemy.

0

Ok, rozumiem. A czy ma już ktoś z Was kod przesyłający obrazek z bazy danych jako dane binarne? (sorki, że pytam tak bezpośrednio)

0

Robię tak i fajnie bo przesyła mi Base64, ale podczas dekodowania obrazek się nie wyświetla. Tak jakby mi ucinało cześć kodu obrazka.

AdoQuery1.SQL.Add('SELECT image FROM imagesDB WHERE image_id = ''' + img_id + ''';');
AdoQuery1.Open;
   while not AdoQuery1.eof do
   begin
      image := encodeBase64Data(AdoQuery1.FieldByname('image').AsWideString);
      ShowMessage(image);
0

@diron16:
nic nie rozumiem , piszesz o przesyłaniu zdjęcia przy pomocy socketów a wklejasz bazodanowy kod

EDT
ShowMessage(image) nie pokaże obrazka

0

Aby wszystko było zrozumiałe:

Mamy, dajmy na to, 3 obrazki w bazie danych.
Wybieram z listy komentarz i wybieram obrazek:

komentarz: "Skocz do sklepu i kup bułki." 
obrazek: "bułki"

Za pomocą tych dwóch parametrów leci zapytanie do bazy danych i pobiera kod binarny obrazka oraz jakiś większy tekst niż ten z listy np. "Skocz do sklepy i kup bułki grahamki z nasionami oraz coś tam coś tam". Mając już wszystko chcę wysłać to po TCP/IP do kolegi w sali, która jest daaaaaaaaleko :)

ShowMessage(Image); wiem że nie wyświetli obrazka, bo ma wyświetlić string obrazka, który wiem jak przesłać po TCP/I, ale taki string to bardzo dużo znaków i długo leci, więc poprosiłem Was o pomoc jak można to usprawnić, aby przesyłanie obrazka było szybsze.

Proszę pamiętać, że kolega ma w swoim pokoju odbiór tych danych w aplikacji w C# i wysyła do mnie odpowiedź też poprzez tą aplikację lub dowolną inną w innym języku.

3

@diron16:

tutaj masz błąd

AdoQuery1.FieldByname('image').AsWideString

próbujesz pobrać z bazy dane binarne jako WideString .
zobacz tutaj:
https://stackoverflow.com/questions/11773986/how-to-insert-image-into-database-using-tadoquery-component-only

EDT:
pisane z głowy ...

var
  field: TBlobField;
  stream: TMemoryStream;
  imageString:ansistring;
begin
  ///
  field := TBlobField(ADOQuery.FieldByName('Image'));
  stream := ADOQuery.CreateBlobStream(Field, bmRead);
  imageString:=EncodeBase64(stream.Memory, Stream.Size);
  ///

end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1