Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как загрузить BLOB в TPicture? / 16 сообщений из 16, страница 1 из 1
13.09.2018, 14:04
    #39702097
adminsamara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
Код: pascal
1.
2.
Picture:Tpicture;
Picture:= Tpicture.Create;


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


и записывать сразу в Picture
Код: pascal
1.
2.
TBlobfield(dm.UniTable1.FieldByName('imagepng')).SaveToStream(stream);
Picture.....


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



Или есть еще какие то варианты?!
...
Рейтинг: 0 / 0
13.09.2018, 14:12
    #39702106
adminsamara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
Код: pascal
1.
2.
TBlobfield(dm.UniTable1.FieldByName('imagepng')).SaveToStream(stream);
Picture.LoadStream(stream);


Не выводит изображение
...
Рейтинг: 0 / 0
13.09.2018, 14:13
    #39702108
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
adminsamaraИли есть еще какие то варианты?!

Выкинуть TPicture, оно всё равно тупая обёртка. Использовать TBitmap/TJPEG/TGIF по
обстоятельствам, у них есть метод LoadFromStream.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2018, 14:18
    #39702116
adminsamara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
Dimitry SibiryakovadminsamaraИли есть еще какие то варианты?!

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


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

как мне загрузить сюда?
Код: pascal
1.
Bitmap.Canvas.Draw(X,Y,Picture.Graphic);
...
Рейтинг: 0 / 0
13.09.2018, 14:20
    #39702119
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
adminsamaraУ TBitmap/TJPEG/TGIF есть .Graphic?


TBitmap/TJPEG/TGIF и есть TGraphic?
...
Рейтинг: 0 / 0
13.09.2018, 14:20
    #39702120
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
TBitmap/TJPEG/TGIF и есть TGraphic
...
Рейтинг: 0 / 0
13.09.2018, 14:25
    #39702125
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
adminsamara,

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

Зацените компонент TMyDBImage с поддержкой BMP, GIF, JPEG
...
Рейтинг: 0 / 0
13.09.2018, 14:29
    #39702126
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
Код: pascal
1.
2.
3.
TBlobfield(dm.UniTable1.FieldByName('imagepng')).SaveToStream(stream);
stream.Position := 0;
Picture.LoadStream(stream);


А лучше так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  strm: TStream;
begin
  strm := dm.UniTable1.CreateBlobStream(dm.UniTable1.FieldByName('imagepng'), bmRead);
  try
    Picture.LoadStream(strm);
  finally
    strm.Free;
  end;
end;

На некоторых движках позволяет избежать лишнего копирования в stream
...
Рейтинг: 0 / 0
13.09.2018, 14:46
    #39702144
adminsamara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
_Vasilisk_
Код: pascal
1.
2.
3.
TBlobfield(dm.UniTable1.FieldByName('imagepng')).SaveToStream(stream);
stream.Position := 0;
Picture.LoadStream(stream);


А лучше так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  strm: TStream;
begin
  strm := dm.UniTable1.CreateBlobStream(dm.UniTable1.FieldByName('imagepng'), bmRead);
  try
    Picture.LoadStream(strm);
  finally
    strm.Free;
  end;
end;

На некоторых движках позволяет избежать лишнего копирования в stream
Код: pascal
1.
[dcc32 Error] Unit2.pas(126): E2010 Incompatible types: 'TMemoryStream' and 'TStream'
...
Рейтинг: 0 / 0
13.09.2018, 14:47
    #39702147
adminsamara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
adminsamara,
Извиняюсь. Смотрю.
...
Рейтинг: 0 / 0
17.09.2018, 09:06
    #39703345
adminsamara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
adminsamara,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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;


Что не так?
...
Рейтинг: 0 / 0
17.09.2018, 09:09
    #39703348
adminsamara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
adminsamara,

и еще, пытался отказаться от picture, но опять не получается:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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;

...
Рейтинг: 0 / 0
17.09.2018, 11:54
    #39703478
adminsamara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
adminsamara,

up!
...
Рейтинг: 0 / 0
17.09.2018, 12:58
    #39703534
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
adminsamaraadminsamara,

и еще, пытался отказаться от picture, но опять не получается:
Код: pascal
1.
2.
3.
4.
    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);


Вообще по идее тебе надо не рисовать, а присваивать загруженную картинку. должно быть что-то вроде:
Код: pascal
1.
Form1.Image322.Bitmap.Assign(Bitmap3);

вместо последних двух строк.
И ещё тебе нужно проверить размер Bitmap3, соответствует ли ширина и высота png.
...
Рейтинг: 0 / 0
17.09.2018, 13:47
    #39703602
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
Может, поможет.

Функция загрузки "произвольной" картинки из блоба:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
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:
Код: pascal
1.
Image.Picture.Graphic := LoadPictureFrobField( BlobField );


Для рисования на канвас:
Код: pascal
1.
2.
3.
// FGraphic - результат фции LoadPictureFrobField
if Assigned( FGraphic ) then
  Canvas.Draw( 0, 0, FGraphic );
...
Рейтинг: 0 / 0
17.09.2018, 18:15
    #39703806
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загрузить BLOB в TPicture?
adminsamara
Код: pascal
1.
[dcc32 Error] Unit2.pas(126): E2010 Incompatible types: 'TMemoryStream' and 'TStream'

Не может быть такой ошибки с этим кодом
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  strm: TStream;
begin
  strm := dm.UniTable1.CreateBlobStream(dm.UniTable1.FieldByName('imagepng'), bmRead);
  try
    Picture.LoadStream(strm);
  finally
    strm.Free;
  end;
end;

Тут MemoryStream не упоминается нигде
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как загрузить BLOB в TPicture? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]