He estado haciendo algunas pruebas con ZEOS y MySQL y me ha funcionado tal como te dije al principio. Quizá el problema lo tengas desde el momento de guardar la imagen, que no se esté guardando correctamente.
En todo caso, por lo que he visto, ni siquiera es necesario usar
streams ya que tanto los objetos TBlobField como los gráficos tienen soporte integrado para escribir y leer desde aquellos.
En resumen, me he armado con este par de funciones que me han dado buenos resultados:
Código Delphi
[-]
procedure FieldToPicture(Field: TField; Picture: TPicture);
var
Jpeg: TJpegImage;
begin
if Field is TBlobField then
begin
if Field.IsNull then
Picture.Graphic := nil
else
begin
Jpeg := TJpegImage.Create;
try
Jpeg.Assign(Field);
Picture.Assign(Jpeg);
finally
Jpeg.Free;
end;
end;
end;
end;
procedure PictureToField(Picture: TPicture; Field: TField);
begin
if (Picture.Graphic is TJPegImage) or not Assigned(Picture.Graphic) then
begin
Assert(Field.DataSet <> nil);
Field.DataSet.Edit;
Field.Assign(Picture.Graphic);
end;
end;
FieldToPicture se usaría para copiar la imagen de un campo Blob a un objeto TPicture, como lo es la propiedad Picture de un componente Image. Lo normal sería usarla en el evento AfterScroll del DataSet:
Código Delphi
[-]
procedure TForm1.ZTable1AfterScroll(DataSet: TDataSet);
begin
FieldToPicture(DataSet.FieldByName('foto'), Image1.Picture);
end;
aunque también iría bien en el AfterCancel para restaurar la imagen original en caso de cancelar la edición.
PictureToField es la inversa y copia el contenido del objeto Picture en el campo. La función se asegura de que Picture contenga un gráfico JPEG. Lo normal aquí sería usarla al cargar una imagen desde un archivo:
Código Delphi
[-]
procedure TForm1.btnLoadPictureClick(Sender: TObject);
begin
if OpenPictureDialog.Execute then
begin
Image1.Picture.LoadFromFile(OpenPictureDialog.FileName);
PictureToField(Image1.Picture, ZTable1.FieldByName('foto'));
end;
end;
o bien, si queremos borrar la imagen:
Código Delphi
[-]
procedure TfrmMain.btnClearPictureClick(Sender: TObject);
begin
Image1.Picture.Graphic := nil;
PictureToField(Image1.Picture, ZTable1.FieldByName('foto'));
end;
Como digo, me han funcionado bien con ZEOS y MySQL.
// Saludos