Пытаюсь загрузить гиф картинку через TOleGraphic и отрисовать её на битмапе, при этом получается фигня с размером картинки в пикселях — при разном разрешении экрана картинка получается разного размера.
Вот примерный код:
Кто может подсказать в чём фигня? (использовать сторонние компоненты — не выход, винда же ведь в проводнике показывает правильный размер, а пользуют они скорее всего не сторонние компоненты а OLELoadPicture).
Здравствуйте, Jone, Вы писали:
J>Кто может подсказать в чём фигня?
Фигня хорошо описана в хелпе:
property MMHeight: Integer;
Description
MMHeight is used for a more accurate reading of the vertical size of the graphic. The Height property, by contrast, is always in screen device pixel units; to avoid loss of precision in converting between device pixels and millimeters, set or read the dimensions in millimeters with MMHeight.
Т.е. Height и Width надо, по-видимому, устанавливать руками с привлечением PixelPerInch формы, на которую выводится рисунок.
Здравствуйте, kavlad, Вы писали:
K>Фигня хорошо описана в хелпе:
K>
K>
K>property MMHeight: Integer;
K>
K>Description
K>MMHeight is used for a more accurate reading of the vertical size of the graphic. The Height property, by contrast, is always in screen device pixel units; to avoid loss of precision in converting between device pixels and millimeters, set or read the dimensions in millimeters with MMHeight.
K>Т.е. Height и Width надо, по-видимому, устанавливать руками с привлечением PixelPerInch формы, на которую выводится рисунок.
К сожалению Height и Width — свойства только для чтения для этого класса (на запись сразу стоит исключение). Да и проблема не в том, чтобы получить правильный размер картинки (это легко прочитать напрямую из файла), а в том, чтобы отрисовать её в оригинальном а не изменённом размере.
kavlad, спасибо за отклик
Здравствуйте, Jone, Вы писали:
J>Да и проблема не в том, чтобы получить правильный размер картинки (это легко прочитать напрямую из файла), а в том, чтобы отрисовать её в оригинальном а не изменённом размере.
Тогда, можно создать отдельный экземпляр TBitmap, ему задавать высоту и ширину, а на его канву копировать содержимое TOleGraphic.
Здравствуйте, kavlad, Вы писали:
K>Здравствуйте, kavlad, Вы писали:
K>>Т, а на его канву копировать содержимое ...
K>Копировать методом StretchDraw
Да, это решение, но чудовищное решение — представьте какова будет потеря качества картинки в реальном размере 16х16 пикселей, которая какого-то хрена отрисовывается как 14х14 (очень грубо — 25% полезной информации теряется) и после этого растягивается до своих положенных 16х16. Забавно, что в разрешении 800х600 картинка уже имеет размер 11х11, а в 1600х1200 — 21х21
Короче говоря косякс ...
procedure ScaleImage(Bitmap:TBitmap;Image:TImage);
begin
// Удаляем из Image изображение
Image.Picture:=nil;
// Устанавливает режим растяжения растрового изображения
// HALFTONE Апроксимирует оригинальный (исходный) цвет в конечный.
SetStretchBltMode(Image.Canvas.Handle, HALFTONE);
// Устанавливает начало координат кисти для указанного контекста устройства
SetBrushOrgEx(Image.Canvas.Handle, 0, 0, nil);
var
fs : TFileStream;
w,h : integer;
gif : TOleGraphic;
bitmap:TBitmap;
begin
if OpenDialog1.Execute then
begin
fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
gif := TOleGraphic.create;
bitmap:=TBitmap.Create;
try
gif.LoadFromStream(fs);
bitmap.Width:=gif.Width;
bitmap.Height:=gif.Height;
bitmap.Canvas.Draw(0, 0, gif);
ScaleImage(bitmap, Image1);
finally
FreeAndNil(fs);
FreeAndNil(gif);
FreeAndNil(bitmap);
end;
end;
end;
Удачи!
Posted via RSDN NNTP Server 1.9
Re: Отрисовка GIF через TOleGraphic
От:
Аноним
Дата:
28.05.08 08:49
Оценка:
Здравствуйте, Jone, Вы писали:
J>Пытаюсь загрузить гиф картинку через TOleGraphic и отрисовать её на битмапе, при этом получается фигня с размером картинки в пикселях — при разном разрешении экрана картинка получается разного размера. J>Вот примерный код:
J>
J>Кто может подсказать в чём фигня? (использовать сторонние компоненты — не выход, винда же ведь в проводнике показывает правильный размер, а пользуют они скорее всего не сторонние компоненты а OLELoadPicture).
поднимаю старую тему. т.к. столкнулся с этой же проблемой. все имеющиеся тут ответы не помогли.
Почему же всетаки gif.Hight и gif.Width (использую имена из примера в первом сообщении) отличаються от реальных примерно на 20%.
Пробовал использовать gif.MMHight и gif.MMWidth как говориться в хелпе (переводил их в пиксели через Form.PixelsPerInch и задавал эти значения в itmap), также пробовал предложенную OlegProv процедуру.
Как будто сам TOleGraphic неверно конвертирует gif.
как же всетаки победить?