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.
Zwyczajowo w stringu powinno trzymać się tekst - obrazek nim nie jest.
Dlaczego nie wyślesz obrazka jako danych binarnych (tablicy bajtów)?
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ć ;/
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.
To może base64?
https://flixengineering.com/archives/270
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.
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)
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);
@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
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.
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;