Конференция "Media" » TOleGraphic изменяет оригинальный размер GIFa? [D7, WinXP]
 
  • miox © (28.05.08 07:44) [0]
    Вот уже долгое время бьюсь над проблемой - надеюсь здесь мне помогут.

    Мспользую TOleGraphic для загрузки в TImage изображений формата gif и jpg. Вот таким вот методом.

    var
    infs : TMemoryStream;//
    s:string;
    w,h,r : integer;
    picture : TOleGraphic;
    bitmap:TBitmap;
    begin
       picture := TOleGraphic.create;
       bitmap:=TBitmap.Create;
       try
         infs:=TMemoryStream.Create;
         infs.Clear ;
         infs.LoadFromFile(filepic);
         picture.LoadFromStream(штfs);
         bitmap.Width:=picture.Width;
         bitmap.Height:=picture.Height;
         StatusBar1.Panels[0].Text := p.W='+InttoSTr(picture.Width) + ' p.H='+InttoSTr(picture.Height);
         bitmap.Canvas.Draw(0, 0, picture);
         Image1.Picture.Bitmap := bitmap;
       finally
         FreeAndNil(picture);
         FreeAndNil(bitmap);
         infs.Free;
       end;
    end;

    По какой то причине размер изображения загруженый из потока в picture меньше примерно на 20% (по свойствам hight/width и визуально также заметно) чем оригинальное изображение. В результате изображение несколько искажается да и вообще мне надо чтоб выводилось оригинальное.
    Пробовал сохранять из потока в файл - этот файл нормальный - значит в потоке нормальный размер. Выходит TOleGraphic глючит или что? Может у меня где то ошибка?
    Как побороть?

    Сторонние компоненты не предлагать это уже напоследок.

    Спасибо заранее.
    miox


  • Palladin © (28.05.08 15:38) [1]
    для jpeg, все работает прекрасно если сделать uses jpeg; для gif, можно выкорчевать модуль из RxLib

    а то, что ты привел, явно не то, что на самом деле
  • miox © (28.05.08 15:56) [2]
    Palladin, на самом деле работаю с GIF. А с JPEG и родные компоненты винды работают (во всяком случае то что мне нужно это просто отобразить на экране оригинальное изображение).

    Кстати доп. информация. Размер выводимой картинки (hight/width) зависит от разрешения экрана. При большом разрешении возможна ситуация когда hight/width загруженной картинки даже больше чем оригинальные размеры. Закономерности не увидел никакой.
    Что за фигня!

    ЗЫ
    Так неохота в winAPI ковырятся. :(
  • Sapersky (28.05.08 16:34) [3]
    http://pda.delphimaster.net/?id=1211878733&n=3
    Лично я получал размеры так:
       Picture.get_Width(w); Picture.get_Height(h);
       DC := CreateCompatibleDC(0);
       B.bmWidth  := MulDiv(w, GetDeviceCaps(DC, LOGPIXELSX), 2540);
       B.bmHeight := MulDiv(h, GetDeviceCaps(DC, LOGPIXELSY), 2540);
       DeleteDC(DC);
    Наверное, CreateCompatibleDC правильнее чем GetDC(0), которая используется в TOleGraphic, во всяком случае, зависимости размера от разрешения не припомню.
    Или, как вариант, Picture.get_Handle(hBmp), затем GetObject.

    А вообще есть хороший компонент TGifImage.
  • miox © (29.05.08 10:44) [4]
    Sapersky, вы правы - так действительно размеры какие надо. Выходит это TOleGraphics кривой?
    Чтож бум копаться в winAPI.
    Спасибо.
 
Конференция "Media" » TOleGraphic изменяет оригинальный размер GIFa? [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]