-
Вот уже долгое время бьюсь над проблемой - надеюсь здесь мне помогут.
Мспользую 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
а то, что ты привел, явно не то, что на самом деле -
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. -
Sapersky, вы правы - так действительно размеры какие надо. Выходит это TOleGraphics кривой?
Чтож бум копаться в winAPI.
Спасибо.