Отрисовка GIF через TOleGraphic
От: Jone  
Дата: 12.05.05 07:10
Оценка:
Пытаюсь загрузить гиф картинку через TOleGraphic и отрисовать её на битмапе, при этом получается фигня с размером картинки в пикселях — при разном разрешении экрана картинка получается разного размера.
Вот примерный код:


procedure TForm1.Button3Click(Sender: TObject);
var  
  fs : TFileStream;
  w,h : integer;
  gif : TOleGraphic;
begin
  OpenDialog1.Execute;
  fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
  gif := TOleGraphic.create;
  try
    gif.LoadFromStream(fs);
    Image1.Picture.Assign(gif);
    w := Image1.width;
    h := Image1.Height;
    showmessage('w = '+intToStr(w)+#13#10+'h = '+intToStr(h));
  finally
    FreeAndNil(fs);
    freeAndNil(gif);
  end;
end;

Кто может подсказать в чём фигня? (использовать сторонние компоненты — не выход, винда же ведь в проводнике показывает правильный размер, а пользуют они скорее всего не сторонние компоненты а OLELoadPicture).
Re: Отрисовка GIF через TOleGraphic
От: Jone  
Дата: 12.05.05 11:13
Оценка:
Неужели никто никогда не пользовался TOleGraphic?
UP
Re: Отрисовка GIF через TOleGraphic
От: kavlad Россия http://www.wavesoft.ru
Дата: 12.05.05 11:19
Оценка:
Здравствуйте, 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 формы, на которую выводится рисунок.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[2]: Отрисовка GIF через TOleGraphic
От: Jone  
Дата: 12.05.05 12:28
Оценка:
Здравствуйте, 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, спасибо за отклик
Re[3]: Отрисовка GIF через TOleGraphic
От: kavlad Россия http://www.wavesoft.ru
Дата: 12.05.05 12:43
Оценка:
Здравствуйте, Jone, Вы писали:

J>Да и проблема не в том, чтобы получить правильный размер картинки (это легко прочитать напрямую из файла), а в том, чтобы отрисовать её в оригинальном а не изменённом размере.


Тогда, можно создать отдельный экземпляр TBitmap, ему задавать высоту и ширину, а на его канву копировать содержимое TOleGraphic.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[4]: Отрисовка GIF через TOleGraphic
От: kavlad Россия http://www.wavesoft.ru
Дата: 12.05.05 12:45
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Т, а на его канву копировать содержимое ...


Копировать методом StretchDraw
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[5]: Отрисовка GIF через TOleGraphic
От: Jone  
Дата: 12.05.05 14:16
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, kavlad, Вы писали:


K>>Т, а на его канву копировать содержимое ...


K>Копировать методом StretchDraw


Да, это решение, но чудовищное решение — представьте какова будет потеря качества картинки в реальном размере 16х16 пикселей, которая какого-то хрена отрисовывается как 14х14 (очень грубо — 25% полезной информации теряется) и после этого растягивается до своих положенных 16х16. Забавно, что в разрешении 800х600 картинка уже имеет размер 11х11, а в 1600х1200 — 21х21
Короче говоря косякс ...
Re[6]: Отрисовка GIF через TOleGraphic
От: OlegProv  
Дата: 13.05.05 06:53
Оценка:
Вот переделал для тебя, надеюсь это то что тебе нужно:

procedure TMainForm.Button2Click(Sender: TObject);

procedure ScaleImage(Bitmap:TBitmap;Image:TImage);
begin
// Удаляем из Image изображение
Image.Picture:=nil;

// Устанавливает режим растяжения растрового изображения
// HALFTONE Апроксимирует оригинальный (исходный) цвет в конечный.
SetStretchBltMode(Image.Canvas.Handle, HALFTONE);

// Устанавливает начало координат кисти для указанного контекста устройства
SetBrushOrgEx(Image.Canvas.Handle, 0, 0, nil);

// Копируем картинку Bitmap в Image
StretchBlt(Image.Canvas.Handle, 0, 0, Image.Width, Image.Height,
Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, SRCCOPY);
end;

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>procedure TForm1.Button3Click(Sender: TObject);
J>var  
J>  fs : TFileStream;
J>  w,h : integer;
J>  gif : TOleGraphic;
J>begin
J>  OpenDialog1.Execute;
J>  fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
J>  gif := TOleGraphic.create;
J>  try
J>    gif.LoadFromStream(fs);
J>    Image1.Picture.Assign(gif);
J>    w := Image1.width;
J>    h := Image1.Height;
J>    showmessage('w = '+intToStr(w)+#13#10+'h = '+intToStr(h));
J>  finally
J>    FreeAndNil(fs);
J>    freeAndNil(gif);
J>  end;
J>end;
J>

J>Кто может подсказать в чём фигня? (использовать сторонние компоненты — не выход, винда же ведь в проводнике показывает правильный размер, а пользуют они скорее всего не сторонние компоненты а OLELoadPicture).

поднимаю старую тему. т.к. столкнулся с этой же проблемой. все имеющиеся тут ответы не помогли.
Почему же всетаки gif.Hight и gif.Width (использую имена из примера в первом сообщении) отличаються от реальных примерно на 20%.
Пробовал использовать gif.MMHight и gif.MMWidth как говориться в хелпе (переводил их в пиксели через Form.PixelsPerInch и задавал эти значения в itmap), также пробовал предложенную OlegProv процедуру.
Как будто сам TOleGraphic неверно конвертирует gif.
как же всетаки победить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.