Программирование мультимедиа-систем. Баканов В.М. - 11 стр.

UptoLike

Составители: 

- 11 -
int nX=Image1->Width;
int nY=Image1->Height;
Размер загруженного в Image изображения:
int pX=Image1->Picture->Width;
int pY=Image1->Picture->Height;
Типовой прием изменения цвета массива пикселов заключается в органи-
зации циклов по координатам:
for (int iX=100; iX<=300; iX++) // цикл по оси абсцисс
for (int iY=200; iY<=400; iY++) // цикл по оси ординат
if (Image1->Canvas->Pixels[iX][iY]==clRed) // если цвет пиксела красный...
Image1->Canvas->Pixels[iX][iY]=clBlue; // cделать его синим!
Заметим, что приведенный выше код недостаточно эффективен по скоро-
сти выполнения (реально вызываются Windows API функции GetPixel и Set-
Pixel, выполняющиеся достаточно медленно) и область его применения огра-
ничена несложными демонстрационными примерами; профессиональный
подход заключается в реализации соответствующего кода на ассемблере (с
последующей ручной оптимизацией, использовании инструкций MMX и
SSE [2]) и работе с расположенной в оперативной
памяти (ОП) копией мас-
сива пикселов (изображение при этом визуализируется только после полной
его обработки). Эффективные решения могут быть достигнуты при исполь-
зовании возможностей разработанной Microsoft Corp. библиотеки DirectX
(примеры C-программирования с использованием компонентов DirectDraw,
DirectSound, DirectMusic, DirectInput и DirectPlay этой библиотеки приведены
в [1,3]).
При работе на Delphi/C++Builder’е более профессиональным является соз-
дание внеэкранного битового о
браза (часто с помощью компонента типа
TBitmap, в дальнейших примерах используется TImage), обработка его в ОП
и 'сброс' оного на экран (режим копирования CopyMode=cmSrcCopy) с по-
мощью метода Draw [3]. Ниже приведен один из (примитивных) примеров
использования внеэкранного образа (объект tmpImage):
TImage *tmpImage; // описание объекта tmpImage
Image1->Picture->LoadFromFile(“имя_файла”); // загрузить и показать
// изображение из файла
tmpImage = new TImage(this); // создать экземпляра объекта TImage
tmpImage->Picture = Image1->Picture; // скопировать содержимое Image
// во внеэкранный контейнер tmpImage
for (int iX=100; iX<=300;iX++) // цикл по оси абсцисс
  int nX=Image1->Width;
  int nY=Image1->Height;

  Размер загруженного в Image изображения:

  int pX=Image1->Picture->Width;
  int pY=Image1->Picture->Height;

  Типовой прием изменения цвета массива пикселов заключается в органи-
зации циклов по координатам:

  for (int iX=100; iX<=300; iX++) // цикл по оси абсцисс
   for (int iY=200; iY<=400; iY++) // цикл по оси ординат
     if (Image1->Canvas->Pixels[iX][iY]==clRed) // если цвет пиксела красный...
      Image1->Canvas->Pixels[iX][iY]=clBlue; // cделать его синим!

   Заметим, что приведенный выше код недостаточно эффективен по скоро-
сти выполнения (реально вызываются Windows API функции GetPixel и Set-
Pixel, выполняющиеся достаточно медленно) и область его применения огра-
ничена несложными демонстрационными примерами; профессиональный
подход заключается в реализации соответствующего кода на ассемблере (с
последующей ручной оптимизацией, использовании инструкций MMX и
SSE [2]) и работе с расположенной в оперативной памяти (ОП) копией мас-
сива пикселов (изображение при этом визуализируется только после полной
его обработки). Эффективные решения могут быть достигнуты при исполь-
зовании возможностей разработанной Microsoft Corp. библиотеки DirectX
(примеры C-программирования с использованием компонентов DirectDraw,
DirectSound, DirectMusic, DirectInput и DirectPlay этой библиотеки приведены
в [1,3]).
   При работе на Delphi/C++Builder’е более профессиональным является соз-
дание внеэкранного битового образа (часто с помощью компонента типа
TBitmap, в дальнейших примерах используется TImage), обработка его в ОП
и 'сброс' оного на экран (режим копирования CopyMode=cmSrcCopy) с по-
мощью метода Draw [3]. Ниже приведен один из (примитивных) примеров
использования внеэкранного образа (объект tmpImage):

  TImage *tmpImage; // описание объекта tmpImage
  …
  Image1->Picture->LoadFromFile(“имя_файла”); // загрузить и показать
                                                     // изображение из файла
  tmpImage = new TImage(this); // создать экземпляра объекта TImage
  tmpImage->Picture = Image1->Picture; // скопировать содержимое Image
                                           // во внеэкранный контейнер tmpImage
  for (int iX=100; iX<=300;iX++) // цикл по оси абсцисс


                                      - 11 -