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

Откуда:
Сообщений: 509
Добрых суток,

В базе FB 2.5 в BLOB поле лежат фотографии.

Пытаюсь их получить в uniImage и что интересно, одна фотография полностью прогружается. А вот другие нет, чуть больше середины изображение загружается и все.

Получаю я их вот такой функцией передавая id поля где лежит изображение и image компонент в который надо вставить это изображение.


function TUniMainModule.GetImageFromBase(perID:integer; perImage:TUniImage):boolean;
var
  perIBQuery:TIBQuery ;
  perTypeImage:integer;
  Stm:TStream;

begin
perIBQuery:=MyInitializationTIBQerySelect(perIBQuery); //
perIBQuery.Active:=false;
perIBQuery.SQL.Clear;
perIBQuery.SQL.Add(
                        'select * from USERS where ID =:perID'
                       );

if  perID = 0 then perIBQuery.ParamByName('perID').IsNull else  perIBQuery.ParamByName('perID').AsInteger:= perID;

  try
  perIBQuery.Active:=true;
  //perIBQuery.Last;
  Stm := perIBQuery.CreateBlobStream( perIBQuery.FieldByName('PHOTO'), bmRead);
  Except
  FreeAndNil(perIBQuery);
  FreeAndNil(Stm);
  end;

  try
  if Stm.Size > 0 then
    begin
    Stm.Position:=0;
//    perImage.Picture.Graphic.LoadFromStream(Stm);
    //perImage.Picture.Graphic:=TJPEGImage.Create;//TBitmap.Create;
    perImage.Picture.LoadFromStream(stm);
    end;
  finally
  FreeAndNil(perIBQuery);
  FreeAndNil(Stm);
  end;
end;


Как можно обойти эту проблему? Может как то , куда - то побитово считать ее а потом вставить? Может кто сталкивался с такой фитчей UniGui?
12 ноя 20, 10:15    [22230605]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1159
ну чисто мое imho, не делай так, храни в базе только путь и имя файла на диске.
зачем тебе лишняя нагрузка на базу + база пухнет, бэкапы дольше делаются и восстанавливаются. А файлы можно спокойно перенести, разнести по разным накопителям и так далее. У меня по молодости и глупости была такая БД, данные 2 гига и еще 20 гигов сканов документов за 2 месяца, ну нафик.
12 ноя 20, 10:31    [22230611]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26836
FIL23
if  perID = 0 then perIBQuery.ParamByName('perID').IsNull 

Может вместо IsNull вызвать Clear?

А проще так:

FIL23
perIBQuery := MyInitializationTIBQerySelect(perIBQuery); //
perIBQuery.SQL.Text := 'select * from USERS where ID = :perID';
if  perID > 0 then perIBQuery.ParamByName('perID').AsInteger := perID;

В случае, если perID = 0 запрос можно вовсе не дергать.
12 ноя 20, 10:48    [22230615]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
goldmi45
Member

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

А в базе нормальные изображения, которые не загружаются в perImage?
Можно выгружать в файл, а из файла уже загружать в UniImage...
12 ноя 20, 10:50    [22230617]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
FIL23
Member

Откуда:
Сообщений: 509
Путем проб выяснилось что фотографии какие то "не правильные" для данного компонента, в файл выгружаются нормально, и даже если из файла загрузить в компонент до компиляции , то полностью фотография загружается и видится в объекте в IDEЮ

Но если запустить программу , фотография так же становится на половину обрезанная.

Я открыл ее в пейнте , изменил немного и пересохранил. после этого она начала хорошо загружаться.

Т.е. получается где то стопорится считка фотографии . те где то есть ошибка в данных фотографии.
12 ноя 20, 11:58    [22230660]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
FIL23
Путем проб выяснилось что фотографии какие то "не правильные" для данного компонента, в файл выгружаются нормально, и даже если из файла загрузить в компонент до компиляции , то полностью фотография загружается и видится в объекте в IDEЮ

Но если запустить программу , фотография так же становится на половину обрезанная.

Я открыл ее в пейнте , изменил немного и пересохранил. после этого она начала хорошо загружаться.

Т.е. получается где то стопорится считка фотографии . те где то есть ошибка в данных фотографии.

Ага, для пэинта ошибок нет, а для компонента - есть. С чего ты решил, что "ошибки" в фотках, а не в твоём компоненте?
12 ноя 20, 12:36    [22230678]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
FIL23
Member

Откуда:
Сообщений: 509
причина ясна, я не правильно передавал данные в поток для записи в blob поле.

Сейчас новую тему создам :)
12 ноя 20, 12:37    [22230679]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
FIL23
Member

Откуда:
Сообщений: 509
Хотя продолжу тут.

Значит пытаюсь вытащить фотографию из LDAP.

таким вот способомо.

  try
  NewADOQuery:=TADOQuery.Create(nil); //запрос на фото
    with NewADOQuery do
    begin
      SQL.Text := 'select thumbnailPhoto from ''LDAP://'+EditDomainName.Text+''' where DisplayName='''+perFIO+'''';
      //SQL.Text := 'select jpegPhoto from ''LDAP://'+EditDomainName.Text+''' where DisplayName='''+perFIO+'''';
      Connection:=NewADOConnection;
    end;
  NewADOQuery.Open;
  except
  MemoLog.Lines.Add('Ошибка запроса в AD для поиска фотографии по ФИО пользователя')
  end;

if not NewADOQuery.IsEmpty then       //если есть, то показываем
  begin
  Stm := TMemoryStream.Create;
  v:=NewADOQuery.FieldByName('thumbnailPhoto').value;

  Stm.Position:= 0;
  p := VarArrayLock(v);
  Stm.Write(p^, VarArrayHighBound(v, 1));
  VarArrayUnlock(v);

  Stm.Position:= 0;
  Image1.Picture.LoadFromStream(stm);
  end;


И фотография попадает в Image все ок.

но вот когда тот же код я пытаюсь использовать на uniimage , то все плохо, на половину фотография загружается (чуть больше половиыны).

Я уже смотрю на вариант может как-то конвертировать изображение для начала.
12 ноя 20, 14:27    [22230771]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
rgreat
Member

Откуда:
Сообщений: 6312
http://forums.unigui.com/index.php?/topic/6619-native-imagelist/&tab=comments#comment-33728
Через Assign попробуй.

Сообщение было отредактировано: 12 ноя 20, 14:53
12 ноя 20, 14:57    [22230791]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
FIL23
Member

Откуда:
Сообщений: 509
Короче решение такое для этого unigui конвертировать изображение в bmp


Ниже приведу код: из запроса беру фотографию - вгоняю ее в поток, потом из этого потока в jpeg ....jpeg конвертирую в bmp , bmp в поток - из потока в БД. ППЦ одним словом...

if not NewADOQuery.IsEmpty then       //если есть, то показываем
  begin
  Stm:=VariantToStram(NewADOQuery.FieldByName('thumbnailPhoto').value)  ;               //преобразовываем фотографию из АД в поток

  Stm.Position:= 0;

  jpeg := TJPEGImage.Create;  //конвертируем из jpeg в bpm
  try
    jpeg.CompressionQuality := 100 ; {Default Value}
    jpeg.LoadFromStream(stm);
    bmp := TBitmap.Create;
    try
      Stm.Free;
      Stm:=TMemoryStream.Create;
      Stm.Position:= 0;
      bmp.Assign(jpeg);
      bmp.SaveToStream(Stm);
    finally
      bmp.Free;
    end;
  finally
    jpeg.Free;
  end;


  perIBQuery:=MyInitializationTIBQeryInsert(perIBQuery); //
  perIBQuery.Active:=false;
  perIBQuery.SQL.Clear;
  perIBQuery.SQL.Add('update USERS '
                    +' set '
                    +'PHOTO = :perPHOTO '
                    +'where ID = :perID'
                    );
  if  perID = 0 then perIBQuery.ParamByName('perID').IsNull else  perIBQuery.ParamByName('perID').AsInteger:= perID;

    try
    Stm.Position:=0;                                                              //
    perIBQuery.ParamByName('perPHOTO').LoadFromStream( Stm, ftBlob);             //
    perIBQuery.ExecSQL;
    IBTransactionComm.Commit;
    except
    MemoLog.Lines.Add('Ошибка добавления фотографии из AD в БД')
    end;

  FreeAndNil(perIBQuery); //
  NewADOQuery.Close;
  FreeAndNil(NewADOConnection);
  FreeAndNil(Stm);
  end;



Как достаю фотку если кому понадобится

function TUniMainModule.GetImageFromBase(perID:integer; perImage:TUniImage):boolean;
var
  perIBQuery:TIBQuery ;
  perTypeImage:integer;
  Stm:TStream;

begin
perIBQuery:=MyInitializationTIBQerySelect(perIBQuery); //
perIBQuery.Active:=false;
perIBQuery.SQL.Clear;
perIBQuery.SQL.Add(
                        'select * from USERS where ID =:perID'
                       );

if  perID = 0 then perIBQuery.ParamByName('perID').IsNull else  perIBQuery.ParamByName('perID').AsInteger:= perID;

  try
  perIBQuery.Active:=true;
  //perIBQuery.Last;
  Stm := perIBQuery.CreateBlobStream( perIBQuery.FieldByName('PHOTO'), bmRead);
  Except
  FreeAndNil(perIBQuery);
  FreeAndNil(Stm);
  end;



  try
  if Stm.Size > 0 then
    begin
    Stm.Position:=0;
//    perImage.Picture.Graphic.LoadFromStream(Stm);
    //perImage.Picture.Graphic:=TJPEGImage.Create;//TBitmap.Create;
    perImage.Picture.Bitmap.LoadFromStream(stm);
    end;
  finally
  FreeAndNil(perIBQuery);
  FreeAndNil(Stm);
  end;
end;
12 ноя 20, 17:47    [22230999]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
defecator
Member

Откуда:
Сообщений: 39394
вот тут откровенная глупость написана
perIBQuery.SQL.Add(
                        'select * from USERS where ID =:perID'
                       );

if  perID = 0 then perIBQuery.ParamByName('perID').IsNull


что вытащится из базы в случае PerID = 0 ?
(это я уже не говорю про IsNull - это функция, которая показывает, Null ли значение, или нет
В твоём случае нужен .Clear

Но всё равно глупость, особенно, если посмотреть, что там дальше в коде ты настряпал)

Сообщение было отредактировано: 12 ноя 20, 18:21
12 ноя 20, 18:24    [22231031]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
FIL23
Member

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


Но всё равно глупость, особенно, если посмотреть, что там дальше в коде ты настряпал)


Конечно там трешь ))) я же системный администратор , а не программист.
12 ноя 20, 19:32    [22231069]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
Gluck99
Member

Откуда: Оттуда
Сообщений: 1085
Автор, у вас там случайно devexpress компоненты не установлены?
12 ноя 20, 19:49    [22231074]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
FIL23
Member

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

Нет
12 ноя 20, 20:25    [22231083]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Храни картинки на диске, а в uniImage подставляй путь, там спец. свойство есть - URL.
13 ноя 20, 09:38    [22231242]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
Почему никто автору не скажет, что нет никакой магии и что метод LoadFromFile определяет формат файла на основе расширения, а для LoadFromStream такая информация недоступна?

Достаточно написать такой код
var
  LGraphicClass: TGraphicClass;
  LGraphic: TGraphic;
begin
  LGraphicClass := DetectGraphicClass(...);
  if LGraphicClass = nil then
    raise Exception.Create('Unknown format');
  LGraphic := LGraphicClass.Create;
  try
    LGraphic.LoadFromStream(Strm);
    perImage.Picture.Assign(LGraphic);
  finally
    LGraphic.Free;
  end;
end;
13 ноя 20, 11:02    [22231282]     Ответить | Цитировать Сообщить модератору
 Re: UniGui Не загружается полностью изображение в image из потока  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14759
Почему никто?
Ты сказал
13 ноя 20, 11:12    [22231293]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить