Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Изменение размеров картинки


Автор: CODARZ 6.12.2003, 20:00
Как посредством Delphi можно изменить размеры картинки
так сказать на лету,
т.е. например была картинка 1024x768, а стала 400x300?

Автор: <Spawn> 6.12.2003, 22:16
Может так:
1) Загружаешь картинку;
2)Делаешь ей нужный StretchBlt;
3)Сохраняешь туда же.

Автор: .RADIX 6.12.2003, 22:42
Какое конкретно изменение ? Масштабирование или обрезание краёв ?

Автор: dr.ZmeY 7.12.2003, 16:48
Код

...
 Form1.Canvas.CopyRect(Bounds(0, 0, 400, 300), Form1.Canvas,Bounds(0, 0, 1024, 768));
...

Но это хреново.. лучше брать несколько соседних пикселей, н/р разбить изображение на квадраты 4х4 (уменьшить в 4 раза), ну в зависимости от того масштаба на который ты хочешь уменьшить, и найти средний цвет этого квадрата...
Код

...
var
 x, y: integer;
 i, j: integer;
 r, g, b: integer;
...
 for y := 0 to 300 do begin
   for x := 0 to 400 do begin
     r := 0;
     for i := 0 to 3 do
       for j := 0 to 3 do
         r := r + GetRValue(Form1.Canvas.Pixels[4*x+i, 4*y+j]);
     r := round(r / 16);
     g := 0;
     for i := 0 to 3 do
       for j := 0 to 3 do
         g := g + GetGValue(Form1.Canvas.Pixels[4*x+i, 4*y+j]);
     g := round(g / 16);
     b := 0;
     for i := 0 to 3 do
       for j := 0 to 3 do
         b := b + GetBValue(Form1.Canvas.Pixels[4*x+i, 4*y+j]);
     b := round(b / 16);
     Form1.Canvas.Pixels[x,y] := RGB(r, g, b)
   end;
   Application.ProcessMessages;
 end;
...

Автор: dr.ZmeY 7.12.2003, 16:52
Как сохранять и читать JPEG найдёшь в ФАКе

Автор: <Spawn> 7.12.2003, 17:32
Snick_Y2K А может лучше воспользоваться StretchBlt?

Код
BOOL StretchBlt(

   HDC hdcDest, // handle of destination device context
   int nXOriginDest, // x-coordinate of upper-left corner of dest. rect.
   int nYOriginDest, // y-coordinate of upper-left corner of dest. rect.
   int nWidthDest, // width of destination rectangle
   int nHeightDest, // height of destination rectangle
   HDC hdcSrc, // handle of source device context
   int nXOriginSrc, // x-coordinate of upper-left corner of source rectangle
   int nYOriginSrc, // y-coordinate of upper-left corner of source rectangle
   int nWidthSrc, // width of source rectangle
   int nHeightSrc, // height of source rectangle
   DWORD dwRop  // raster operation code
  );

Автор: <Spawn> 7.12.2003, 17:53
Хотя щас решил взглянуть на внутренность CopyRect - там и есть эта StretchBlt. Сам я особенно этим не пользовался, так что может твой вариант и лучше, но насколько я знаю, SetPixel(а эта функция используется внутри) работает достаточно медленно, так что лучше для этого варианта зайти на сайт Мастеров Дельфи и скачать там класс QPixels, с прямым доступом к видеопамяти.

Автор: dr.ZmeY 7.12.2003, 20:16
Цитата
так что лучше для этого варианта зайти на сайт Мастеров Дельфи и скачать там класс QPixels, с прямым доступом к видеопамяти.

Да, пожалуй я его себе тоже скачаю smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)