Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как загрузить BLOB в TPicture?  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 529
Picture:Tpicture;
Picture:= Tpicture.Create;

и тут вопрос, Как можно уйти от
TBlobfield(dm.UniTable1.FieldByName('imagepng')).SaveToFile('...');
Picture.LoadFromFile(...);

и записывать сразу в Picture
TBlobfield(dm.UniTable1.FieldByName('imagepng')).SaveToStream(stream);
Picture.....

Почему нужен именно Picture?! Потому что я использую далее:
Bitmap.Canvas.Draw(X,Y,Picture.Graphic);
BitBlt(Form1.Image321.Bitmap.Handle,0,0,Bitmap.Width,Bitmap.Height,Bitmap.Handle,0,0, SRCCOPY);


Или есть еще какие то варианты?!
13 сен 18, 14:04    [21673553]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 529
TBlobfield(dm.UniTable1.FieldByName('imagepng')).SaveToStream(stream);
Picture.LoadStream(stream);

Не выводит изображение
13 сен 18, 14:12    [21673574]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45680

adminsamara
Или есть еще какие то варианты?!

Выкинуть TPicture, оно всё равно тупая обёртка. Использовать TBitmap/TJPEG/TGIF по
обстоятельствам, у них есть метод LoadFromStream.

Posted via ActualForum NNTP Server 1.5

13 сен 18, 14:13    [21673576]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 529
Dimitry Sibiryakov
adminsamara
Или есть еще какие то варианты?!

Выкинуть TPicture, оно всё равно тупая обёртка. Использовать TBitmap/TJPEG/TGIF по
обстоятельствам, у них есть метод LoadFromStream.


У TBitmap/TJPEG/TGIF есть .Graphic?

как мне загрузить сюда?
Bitmap.Canvas.Draw(X,Y,Picture.Graphic);
13 сен 18, 14:18    [21673589]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5064
adminsamara
У TBitmap/TJPEG/TGIF есть .Graphic?


TBitmap/TJPEG/TGIF и есть TGraphic?
13 сен 18, 14:20    [21673594]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5064
TBitmap/TJPEG/TGIF и есть TGraphic
13 сен 18, 14:20    [21673595]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6209
adminsamara,

подсмотрите код этого компонента:

Зацените компонент TMyDBImage с поддержкой BMP, GIF, JPEG
13 сен 18, 14:25    [21673606]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10488
TBlobfield(dm.UniTable1.FieldByName('imagepng')).SaveToStream(stream);
stream.Position := 0;
Picture.LoadStream(stream);

А лучше так
var
  strm: TStream;
begin
  strm := dm.UniTable1.CreateBlobStream(dm.UniTable1.FieldByName('imagepng'), bmRead);
  try
    Picture.LoadStream(strm);
  finally
    strm.Free;
  end;
end;
На некоторых движках позволяет избежать лишнего копирования в stream
13 сен 18, 14:29    [21673614]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 529
_Vasilisk_
TBlobfield(dm.UniTable1.FieldByName('imagepng')).SaveToStream(stream);
stream.Position := 0;
Picture.LoadStream(stream);

А лучше так
var
  strm: TStream;
begin
  strm := dm.UniTable1.CreateBlobStream(dm.UniTable1.FieldByName('imagepng'), bmRead);
  try
    Picture.LoadStream(strm);
  finally
    strm.Free;
  end;
end;
На некоторых движках позволяет избежать лишнего копирования в stream

[dcc32 Error] Unit2.pas(126): E2010 Incompatible types: 'TMemoryStream' and 'TStream'
13 сен 18, 14:46    [21673653]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 529
adminsamara,
Извиняюсь. Смотрю.
13 сен 18, 14:47    [21673656]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 529
adminsamara,
procedure TForm1.Button1Click(Sender: TObject);
var
    strm: TStream;
    Picture2:Tpicture;            //+
    Bitmap3: TBitmap32;
begin
  Picture2:= Tpicture.Create;
  bitmap3:=tbitmap32.Create;
  strm := dm.UniTable1.CreateBlobStream(dm.UniTable1.FieldByName('imagepng'), bmRead);
  //strm.Position := 0;
  try
    Picture2.LoadfromStream(strm);
    Bitmap3.Canvas.Draw(0,0,Picture2.Graphic);
    image322.Bitmap.Clear(clWhite32);
    BitBlt(Form1.Image322.Bitmap.Handle,0,0,0,0,Bitmap3.Handle,0,0, SRCCOPY);
  finally
    strm.Free;
  end;
end;

Что не так?
вчера, 09:06    [21676355]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 529
adminsamara,

и еще, пытался отказаться от picture, но опять не получается:
+
procedure TForm1.Button1Click(Sender: TObject);
var
    strm: TStream;
    Picture2:Tpicture;            //+
    Bitmap3: TBitmap32;
    png:tpngimage;
begin
  Picture2:= Tpicture.Create;
  bitmap3:=tbitmap32.Create;
  png:=tpngimage.Create;
  strm := dm.UniTable1.CreateBlobStream(dm.UniTable1.FieldByName('imagepng'), bmRead);
  //strm.Position := 0;
  try
    //Picture2.LoadfromStream(strm);
    png.LoadFromStream(strm);
    Bitmap3.Canvas.Draw(0,0,png);
    image322.Bitmap.Clear(clWhite32);
    BitBlt(Form1.Image322.Bitmap.Handle,0,0,0,0,Bitmap3.Handle,0,0, SRCCOPY);
  finally
    strm.Free;
  end;
end;
вчера, 09:09    [21676358]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
adminsamara
Member

Откуда: Самара
Сообщений: 529
adminsamara,

up!
вчера, 11:54    [21676605]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
Dimonka
Member

Откуда:
Сообщений: 1034
adminsamara
adminsamara,

и еще, пытался отказаться от picture, но опять не получается:
    png.LoadFromStream(strm);
    Bitmap3.Canvas.Draw(0,0,png);
    image322.Bitmap.Clear(clWhite32);
    BitBlt(Form1.Image322.Bitmap.Handle,0,0,0,0,Bitmap3.Handle,0,0, SRCCOPY);

Вообще по идее тебе надо не рисовать, а присваивать загруженную картинку. должно быть что-то вроде:
Form1.Image322.Bitmap.Assign(Bitmap3);
вместо последних двух строк.
И ещё тебе нужно проверить размер Bitmap3, соответствует ли ширина и высота png.
вчера, 12:58    [21676743]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3527
Может, поможет.

Функция загрузки "произвольной" картинки из блоба:
+
uses Graphics, DB, Classes, JPEG, pngimage, SysUtils;

function LoadPictureFrobField( Field: TBlobField ): TGraphic;
var
  Stream: TMemoryStream;
  aHeader: Array[ 0 .. 9 ] of AnsiChar;
begin
  Result := nil;
  if Field.IsNull then
    Exit;

  try
    Stream := TMemoryStream.Create;
    try
      Field.SaveToStream( Stream );
      if Stream.Size < sizeof( aHeader ) then
        Exit;

      Move( Stream.Memory^, aHeader, sizeof( aHeader ) );
      if ( aHeader[ 0 ] = 'B' ) and ( aHeader[ 1 ] = 'M' ) then begin
        Stream.Position := 0;
        Result := Graphics.TBitmap.Create;
        Result.Transparent := True;
        Result.LoadFromStream( Stream );
      end else if ( aHeader[ 1 ] = 'P' ) and ( aHeader[ 2 ] = 'N' ) and ( aHeader[ 3 ] = 'G' ) then begin
        Stream.Position := 0;
        Result := TPNGObject.Create;
        Result.Transparent := True;
        Result.LoadFromStream( Stream );
      end else if ( aHeader[ 6 ] = 'J' ) and ( aHeader[ 7 ] = 'F' ) and ( aHeader[ 8 ] = 'I' ) and ( aHeader[ 9 ] = 'F' ) then begin
        Stream.Position := 0;
        Result := TJPEGImage.Create;
        Result.LoadFromStream( Stream );
      end else
        Exit;
    finally
      Stream.Free;
    end;
  except
    FreeAndNil( Result );
  end;
end;


Использование.
Для TImage/TPicture:
Image.Picture.Graphic := LoadPictureFrobField( BlobField );

Для рисования на канвас:
// FGraphic - результат фции LoadPictureFrobField
if Assigned( FGraphic ) then
  Canvas.Draw( 0, 0, FGraphic );
вчера, 13:47    [21676855]     Ответить | Цитировать Сообщить модератору
 Re: Как загрузить BLOB в TPicture?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10488
adminsamara
[dcc32 Error] Unit2.pas(126): E2010 Incompatible types: 'TMemoryStream' and 'TStream'
Не может быть такой ошибки с этим кодом
_Vasilisk_
var
  strm: TStream;
begin
  strm := dm.UniTable1.CreateBlobStream(dm.UniTable1.FieldByName('imagepng'), bmRead);
  try
    Picture.LoadStream(strm);
  finally
    strm.Free;
  end;
end;
Тут MemoryStream не упоминается нигде
вчера, 18:15    [21677255]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить