<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_2_subsect_6_thread_34867"  />
<title>rulinux.net - Статьи - Development - Извлечение пикселей из картинки при помощи ImageMagick и показ картинки в виждете gtk2-perl</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Статьи - Development - Извлечение пикселей из картинки при помощи ImageMagick и показ картинки в виждете gtk2-perl</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Извлечение пикселей из картинки при помощи ImageMagick и показ картинки в виждете gtk2-perl</title>
<link>https://rulinux.net/message.php?newsid=34867&amp;page=1#109472</link>
<guid>https://rulinux.net/message.php?newsid=34867&amp;page=1#109472</guid>
<pubDate>Thu, 04 Mar 2010 16:43:00 +0300</pubDate>
<description><![CDATA[<p>
<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> | <a href=xs.html>Предыдущая</a> | Извлечение пикселей |
<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/c1.html">подсчет объектов</a>
| | <a href="haar.html">wavelet</a>

<p>
Извлечение пикселей из картинки при помощи ImageMagick и показ картинки в
виждете gtk2-perl.<p align=justify>
Gtk2-perl позволяет получить доступ к пикселям при помощи функции
get_pixels, которая возвращает 16-ти битную строку пикселей длины w*h*3 для
RGB изображения.
Единственное неудобство в том, что функции для работы с изображениями Gtk2-perl понимают
несколько форматов картинок, а ImageMagick позволяет работать с более чем
90 форматами изображений. Функция Gtk2::Gdk::Pixbuf->new_from_data может из
строки в 16-тиричном формате выстраивать картинку. Значит для этого надо
открыть картинку, прочитать пикселы и затем сформировать и
передать в perl соответствующую строку при помощи библиотеки ImageMagick. 
<p align=justify>
Для начала необходимо написать программу на c, после чего уже писать
соответствующий XS-модуль. Программа выглядит как-то так:
<pre>
<font color="#0000ff"><strong>#include <font color="#008000">&lt;stdlib.h&gt;</font></strong></font>
<font color="#0000ff"><strong>#include <font color="#008000">&lt;stdio.h&gt;</font></strong></font>
<font color="#0000ff"><strong>#include <font color="#008000">&lt;string.h&gt;</font></strong></font>
// подключить API ImageMagick

<font color="#0000ff"><strong>#include <font color="#008000">&lt;magick/api.h&gt;</font></strong></font>

<strong>int</strong> <font color="#2040a0">main</font><font color="#4444ff">(</font><strong>int</strong> <font color="#2040a0">argc</font>,<strong>char</strong> <font color="#4444ff">*</font><font color="#4444ff">*</font><font color="#2040a0">argv</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

//Воспользоваться внутренними типами IM
  <font color="#2040a0">ExceptionInfo</font>
      <font color="#2040a0">exception</font><font color="#4444ff">;</font>
  <font color="#2040a0">Image</font>
      <font color="#4444ff">*</font><font color="#2040a0">image</font><font color="#4444ff">;</font>
  <font color="#2040a0">ImageInfo</font>

      <font color="#4444ff">*</font><font color="#2040a0">image_info</font><font color="#4444ff">;</font>
  <font color="#2040a0">PixelPacket</font> 
      <font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">;</font>
  <font color="#2040a0">ViewInfo</font> 
      <font color="#4444ff">*</font><font color="#2040a0">vinfo</font><font color="#4444ff">;</font>

  <strong>int</strong> <font color="#2040a0">i</font>,<font color="#2040a0">j</font>,<font color="#2040a0">w</font>,<font color="#2040a0">h</font><font color="#4444ff">;</font>
// Инициализировать структуру <font color="#2040a0">image</font> <font color="#2040a0">info</font> и прочитать изображение
  <font color="#2040a0">InitializeMagick</font><font color="#4444ff">(</font><font color="#4444ff">*</font><font color="#2040a0">argv</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

// установить обработку событий типа ReadError и т.п.
  <font color="#2040a0">GetExceptionInfo</font><font color="#4444ff">(</font><font color="#4444ff">&amp;</font><font color="#2040a0">exception</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
// сделлать копию структуры image info
  <font color="#2040a0">image_info</font><font color="#4444ff">=</font><font color="#2040a0">CloneImageInfo</font><font color="#4444ff">(</font><font color="#4444ff">(</font><font color="#2040a0">ImageInfo</font> <font color="#4444ff">*</font><font color="#4444ff">)</font> <font color="#2040a0">NULL</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

// скопировать в структуру имя файла
  <font color="#4444ff">(</font><strong>void</strong><font color="#4444ff">)</font><font color="#2040a0">strcpy</font><font color="#4444ff">(</font><font color="#2040a0">image_info</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">filename</font>,<font color="#008000">"image.gif"</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
// прочитать картинку, попутно отработав эксепшены &exception 
  <font color="#2040a0">image</font><font color="#4444ff">=</font><font color="#2040a0">ReadImage</font><font color="#4444ff">(</font><font color="#2040a0">image_info</font>,<font color="#4444ff">&amp;</font><font color="#2040a0">exception</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <strong>if</strong> <font color="#4444ff">(</font><font color="#2040a0">image</font> <font color="#4444ff">=</font><font color="#4444ff">=</font> <font color="#4444ff">(</font><font color="#2040a0">Image</font> <font color="#4444ff">*</font><font color="#4444ff">)</font> <font color="#2040a0">NULL</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

// в случае ошибки
    <font color="#2040a0">fprintf</font><font color="#4444ff">(</font><font color="#2040a0">stderr</font>, <font color="#008000">"readFileMagick: %s: %s<font color="#77dd77">\n</font>"</font>,
    <font color="#2040a0">exception</font>.<font color="#2040a0">reason</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">description</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

// <font color="#2040a0">MagickError</font><font color="#4444ff">(</font><font color="#2040a0">exception</font>.<font color="#2040a0">severity</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">reason</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">description</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

    <strong>return</strong> <font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">;</font>
  <font color="#4444ff"><strong>}</strong></font>
// открыть открыть просмотр кеша пикселей
  <font color="#2040a0">vinfo</font> <font color="#4444ff">=</font> <font color="#2040a0">OpenCacheView</font><font color="#4444ff">(</font><font color="#2040a0">image</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">pixels</font> <font color="#4444ff">=</font> <font color="#2040a0">GetCacheView</font><font color="#4444ff">(</font><font color="#2040a0">vinfo</font>, <font color="#ff0000">0</font>,<font color="#ff0000">0</font>,<font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">columns</font>,<font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">rows</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <strong>if</strong><font color="#4444ff">(</font><font color="#4444ff">!</font><font color="#2040a0">pixels</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>
    <font color="#2040a0">fprintf</font><font color="#4444ff">(</font><font color="#2040a0">stderr</font>, <font color="#008000">"readFileMagick: ошибка чтения кеша пикселей.<font color="#77dd77">\n</font>"</font><font color="#4444ff">)</font><font color="#4444ff">;</font> 
    <strong>return</strong><font color="#4444ff">(</font><font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#4444ff"><strong>}</strong></font>
  <font color="#2040a0">h</font> <font color="#4444ff">=</font> <font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">columns</font><font color="#4444ff">;</font> //ширина по горизонтали <font color="#4444ff">(</font>число столбцов картинки<font color="#4444ff">)</font>

  <font color="#2040a0">w</font> <font color="#4444ff">=</font> <font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">rows</font><font color="#4444ff">;</font>    //высота по вертикали   <font color="#4444ff">(</font>число строк картинки<font color="#4444ff">)</font>
// вывести значения пикселов по трем каналам
  <strong>for</strong> <font color="#4444ff">(</font><font color="#2040a0">i</font> <font color="#4444ff">=</font> <font color="#ff0000">0</font><font color="#4444ff">;</font> <font color="#2040a0">i</font> <font color="#4444ff">&lt;</font><font color="#4444ff">=</font> <font color="#2040a0">w</font><font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">;</font> <font color="#2040a0">i</font><font color="#4444ff">+</font><font color="#4444ff">+</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

    <strong>for</strong> <font color="#4444ff">(</font><font color="#2040a0">j</font> <font color="#4444ff">=</font> <font color="#ff0000">0</font><font color="#4444ff">;</font> <font color="#2040a0">j</font> <font color="#4444ff">&lt;</font><font color="#4444ff">=</font> <font color="#2040a0">h</font><font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">;</font> <font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#4444ff">+</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

      <font color="#2040a0">printf</font><font color="#4444ff">(</font><font color="#008000">"%d "</font>,<font color="#4444ff">(</font><strong>int</strong><font color="#4444ff">)</font><font color="#ff0000">255</font><font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">[</font><font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#2040a0">h</font><font color="#4444ff">*</font><font color="#2040a0">i</font><font color="#4444ff">]</font>.<font color="#2040a0">blue</font>/<font color="#ff0000">65535</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

      <font color="#2040a0">printf</font><font color="#4444ff">(</font><font color="#008000">"%d "</font>,<font color="#4444ff">(</font><strong>int</strong><font color="#4444ff">)</font><font color="#ff0000">255</font><font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">[</font><font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#2040a0">h</font><font color="#4444ff">*</font><font color="#2040a0">i</font><font color="#4444ff">]</font>.<font color="#2040a0">green</font>/<font color="#ff0000">65535</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

      <font color="#2040a0">printf</font><font color="#4444ff">(</font><font color="#008000">"%d<font color="#77dd77">\n</font>"</font>,<font color="#4444ff">(</font><strong>int</strong><font color="#4444ff">)</font><font color="#ff0000">255</font><font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">[</font><font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#2040a0">h</font><font color="#4444ff">*</font><font color="#2040a0">i</font><font color="#4444ff">]</font>.<font color="#2040a0">red</font>/<font color="#ff0000">65535</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

    <font color="#4444ff"><strong>}</strong></font>
  <font color="#4444ff"><strong>}</strong></font>
// закрыть и уничтожить все
  <font color="#2040a0">CloseCacheView</font><font color="#4444ff">(</font><font color="#2040a0">vinfo</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
  <font color="#2040a0">DestroyImageInfo</font><font color="#4444ff">(</font><font color="#2040a0">image_info</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">DestroyImage</font><font color="#4444ff">(</font><font color="#2040a0">image</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
  <strong>return</strong><font color="#4444ff">(</font><font color="#ff0000">0</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
<font color="#4444ff"><strong>}</strong></font>

</pre>
компилировать программу можно таким <a
href="http://www.magickwand.org/www/api.html">образом</a>:

<pre>
    setenv LD_LIBRARY_PATH /usr/local/lib
    gcc `Magick-config --cflags --cppflags` pixels.c `Magick-config --ldflags --libs`
</pre>
Требования к функции, возвращающей пикселы, следующие: имя файла должно
передаваться в качестве параметра и в нагрузку параметр для чегонибудь
сделания с извлекаемыми пикселами. Функция должна возвращать строку пикселей в
16-тиричном виде и высоту + ширину картинки, необходимые для new_from_data().
Чтобы получить имя картинки в XS, можно воспользоваться следующим
подходом:
<pre>
SV*
pixs (SV * fn, int k)
  INIT:
       unsigned char * lfn;
       STRLEN l;  /* STRLEN is a certain type of int */
       /* ... */
  CODE:
       lfn = SvPV (fn, l); 
</pre>
после этого имя картинки будет содержаться в переменной lfn.
<p>
В целом, на XS вышеприведенная программа выглядит таким образом: 
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>
// string.h нужен для функции strcpy
<font color="0000ff"><strong>#include <font color="#008000">&lt;string.h&gt;</font></strong></font>
// на всякий случай, для матобработкию. если таковая будет, чтобы не писать при компиляции -lm
<font color="0000ff"><strong>#include <font color="#008000">&lt;math.h&gt;</font></strong></font>
// для ImageMagick
<font color="0000ff"><strong>#include <font color="#008000">&lt;magick/api.h&gt;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>
// определить название модуля, необходимого далее для инициализации ImageMagick
<font color="0000ff"><strong>#define PackageName <font color="#008000">&quot;Pixels&quot;</font></strong></font>
// название модуля и пакетов
<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Pixels</font>		<font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Pixels</font>		

// отключить прототипы, о(see perldoc perlxs)
<font color="#2040a0">PROTOTYPES</font><font color="4444FF">:</font> <font color="#2040a0">DISABLE</font>
// Инициализировать ImageMagick (see perldoc perlxs)
<font color="#2040a0">BOOT</font><font color="4444FF">:</font>
  <font color="#2040a0">InitializeMagick</font><font color="4444FF">(</font><font color="#2040a0">PackageName</font><font color="4444FF">)</font><font color="4444FF">;</font>

// скаляр (see perldoc perlguts), функции передаются на вход два параметра,
// имя файла и что-то еще. Тип передаваемых параметров определяется только десь
<font color="#2040a0">SV</font><font color="4444FF">*</font>
<font color="#2040a0">pixs</font><font color="4444FF">(</font><font color="#2040a0">SV</font> <font color="4444FF">*</font><font color="#2040a0">fn</font>, <strong>int</strong> <font color="#2040a0">k</font><font color="4444FF">)</font>

  <font color="#2040a0">INIT</font><font color="4444FF">:</font>
//Воспользоваться внутренними типами IM
        <font color="#2040a0">ExceptionInfo</font>
          <font color="#2040a0">exception</font><font color="4444FF">;</font>
        <font color="#2040a0">Image</font>
          <font color="4444FF">*</font><font color="#2040a0">image</font><font color="4444FF">;</font>

        <font color="#2040a0">ImageInfo</font>
          <font color="4444FF">*</font><font color="#2040a0">info</font>,
          <font color="4444FF">*</font><font color="#2040a0">image_info</font><font color="4444FF">;</font>
        <font color="#2040a0">PixelPacket</font>
          <font color="4444FF">*</font><font color="#2040a0">pixels</font><font color="4444FF">;</font>

        <font color="#2040a0">ViewInfo</font>
          <font color="4444FF">*</font><font color="#2040a0">vinfo</font><font color="4444FF">;</font>
// определить двумерные массивы для хранения пикселов
        <strong>int</strong> <font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sm</font>,<font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sym</font>,<font color="#2040a0">i</font>,<font color="#2040a0">j</font><font color="4444FF">;</font>

// переменные для имени  файла и возвращаемого значения пикселов
        <strong>unsigned</strong> <strong>char</strong> <font color="4444FF">*</font> <font color="#2040a0">lfn</font>, <font color="4444FF">*</font> <font color="#2040a0">number</font><font color="4444FF">;</font>
// определение STRLEN находится в файле config.h (perldoc perlguts)
        <font color="#2040a0">STRLEN</font> <font color="#2040a0">t</font><font color="4444FF">;</font> 

// определение типа данных для хеша и для массива *только для XSUBs* (perldoc perlguts)
        <font color="#2040a0">HV</font><font color="4444FF">*</font> <font color="#2040a0">hash</font> <font color="4444FF">=</font> <font color="#2040a0">newHV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font> 
        <font color="#2040a0">AV</font><font color="4444FF">*</font> <font color="#2040a0">array</font> <font color="4444FF">=</font> <font color="#2040a0">newAV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

  <font color="#2040a0">CODE</font><font color="4444FF">:</font>
// присваивание имени, впрочем, это описано в perldoc perlguts
        <font color="#2040a0">lfn</font> <font color="4444FF">=</font> <font color="#2040a0">SvPV</font> <font color="4444FF">(</font><font color="#2040a0">fn</font>,<font color="#2040a0">t</font><font color="4444FF">)</font><font color="4444FF">;</font>

// установить обработку событий типа ReadError и т.п.
        <font color="#2040a0">GetExceptionInfo</font><font color="4444FF">(</font><font color="4444FF">&amp;</font><font color="#2040a0">exception</font><font color="4444FF">)</font><font color="4444FF">;</font>
// сделлать копию структуры image info
        <font color="#2040a0">image_info</font><font color="4444FF">=</font><font color="#2040a0">CloneImageInfo</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">ImageInfo</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">NULL</font><font color="4444FF">)</font><font color="4444FF">;</font>

// скопировать в структуру имя файла
        <font color="#2040a0">strcpy</font><font color="4444FF">(</font><font color="#2040a0">image_info</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">filename</font>, <font color="#2040a0">lfn</font><font color="4444FF">)</font><font color="4444FF">;</font>
// прочитать картинку, попутно отработав эксепшены &exception 
        <font color="#2040a0">image</font><font color="4444FF">=</font><font color="#2040a0">ReadImage</font><font color="4444FF">(</font><font color="#2040a0">image_info</font>,<font color="4444FF">&amp;</font><font color="#2040a0">exception</font><font color="4444FF">)</font><font color="4444FF">;</font>

// в случае ошибки
        <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">image</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">Image</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">NULL</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>     
          <font color="#2040a0">fprintf</font><font color="4444FF">(</font><font color="#2040a0">stderr</font>, <font color="#008000">&quot;readFileMagick: %s: %s<font color="#77dd77">\n</font>&quot;</font>,
          <font color="#2040a0">exception</font>.<font color="#2040a0">reason</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">description</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
// открыть просмотр кеша пикселей
        <font color="#2040a0">vinfo</font> <font color="4444FF">=</font> <font color="#2040a0">OpenCacheView</font><font color="4444FF">(</font><font color="#2040a0">image</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">pixels</font> <font color="4444FF">=</font> <font color="#2040a0">GetCacheView</font><font color="4444FF">(</font><font color="#2040a0">vinfo</font>, <font color="#FF0000">0</font>,<font color="#FF0000">0</font>,<font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">columns</font>,<font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">rows</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>int</strong> <font color="#2040a0">h</font><font color="4444FF">=</font><font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">columns</font><font color="4444FF">;</font> //ширина по горизонтали <font color="4444FF">(</font>число столбцов<font color="4444FF">)</font>
        <strong>int</strong> <font color="#2040a0">w</font><font color="4444FF">=</font><font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">rows</font><font color="4444FF">;</font>    //высота по вертикали   <font color="4444FF">(</font>число строк<font color="4444FF">)</font>

// занести данные о высоте и ширине картинки в массив, который будет
// сопоставлен с ключом хеша arr
        <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#2040a0">h</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#2040a0">w</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>int</strong> <font color="#2040a0">small</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">*</font><font color="#2040a0">h</font><font color="4444FF">*</font><font color="#FF0000">3</font><font color="4444FF">;</font>
// выделение памяти для строки возвращаемых пикселов, длина строки должна
// быть равна определенной выше small.
        <font color="#2040a0">number</font><font color="4444FF">=</font><font color="#2040a0">malloc</font><font color="4444FF">(</font><font color="#2040a0">small</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">number</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

// отработка ошибки, если возникнут проблемы с pixels
        <strong>if</strong><font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">pixels</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
          <font color="#2040a0">fprintf</font><font color="4444FF">(</font><font color="#2040a0">stderr</font>, <font color="#008000">&quot;readFileMagick: unable to get pixel cache.<font color="#77dd77">\n</font>&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
// выделение памяти для двумерных массивово
        <font color="#2040a0">sm</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font><font color="4444FF">(</font><font color="#2040a0">w</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">sm</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="#2040a0">w</font><font color="4444FF">;</font> <font color="4444FF">+</font><font color="4444FF">+</font><font color="#2040a0">i</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

          <font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font> <font color="4444FF">(</font> <font color="#2040a0">h</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sm</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
        <font color="#2040a0">sym</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font><font color="4444FF">(</font><font color="#2040a0">w</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">sym</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="#2040a0">w</font><font color="4444FF">;</font> <font color="4444FF">+</font><font color="4444FF">+</font><font color="#2040a0">i</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

          <font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font> <font color="4444FF">(</font> <font color="#2040a0">h</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sym</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
// заполнение массива пикселей для дальнейшей обработки
        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>

          <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">j</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">h</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>

            <font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>int</strong><font color="4444FF">)</font><font color="#FF0000">255</font><font color="4444FF">*</font><font color="#2040a0">pixels</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">+</font><font color="#2040a0">h</font><font color="4444FF">*</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">blue</font>/<font color="#FF0000">65535</font><font color="4444FF">;</font>

            <font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

          <font color="4444FF"><strong>}</strong></font>
        <font color="4444FF"><strong>}</strong></font>
// математическая обработка пикселей, алгоритм подробно описан <a href=http://genphys.phys.msu.ru/~dmitriyk/site/mv/Smai/smai.html>здесь</a> и  <a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html#smai">здесь немного</a>
        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

          <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">j</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">h</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

            <strong>int</strong> <font color="#2040a0">summ</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font>
            <strong>int</strong> <font color="#2040a0">ii</font>,<font color="#2040a0">jj</font><font color="4444FF">;</font>
            <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">ii</font><font color="4444FF">=</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">ii</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">ii</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

              <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">jj</font><font color="4444FF">=</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">jj</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">jj</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="#2040a0">summ</font><font color="4444FF">+</font><font color="4444FF">=</font><font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">+</font><font color="#2040a0">ii</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">+</font><font color="#2040a0">jj</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="4444FF"><strong>}</strong></font>
            <font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>int</strong><font color="4444FF">)</font><font color="#2040a0">summ</font>/<font color="4444FF">(</font><font color="4444FF">(</font><font color="#FF0000">2</font><font color="4444FF">*</font><font color="#2040a0">k</font><font color="4444FF">+</font><font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF">*</font><font color="4444FF">(</font><font color="#FF0000">2</font><font color="4444FF">*</font><font color="#2040a0">k</font><font color="4444FF">+</font><font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

          <font color="4444FF"><strong>}</strong></font>
        <font color="4444FF"><strong>}</strong></font>
        <strong>int</strong> <font color="#2040a0">count</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font>
// заполнение массива пикселей, которые будут возвращаться в perl-программу по ключу хеша uns
        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

          <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">j</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">h</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

            <font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">count</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">)</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="#2040a0">count</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
            <font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">count</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">)</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="#2040a0">count</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
            <font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">count</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">)</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="#2040a0">count</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
          <font color="4444FF"><strong>}</strong></font>
//освободить память из под массивов 
          <font color="#2040a0">free</font> <font color="4444FF">(</font><font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">;</font>

          <font color="#2040a0">free</font> <font color="4444FF">(</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="4444FF"><strong>}</strong></font>
        <font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">sm</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">sym</font><font color="4444FF">)</font><font color="4444FF">;</font>
// закрыть и уничтожить все
        <font color="#2040a0">CloseCacheView</font><font color="4444FF">(</font><font color="#2040a0">vinfo</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">DestroyImageInfo</font><font color="4444FF">(</font><font color="#2040a0">image_info</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">DestroyImage</font><font color="4444FF">(</font><font color="#2040a0">image</font><font color="4444FF">)</font><font color="4444FF">;</font>
// добавить в значение хеша массив
        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;arr&quot;</font>,<font color="#FF0000">3</font>,<font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font><font color="#2040a0">array</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

// добавить в значение хеша строку unsigned char, которая ассоциируется с ключем uns
// четвертым параметром идет выделение памяти для переменной number
        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;uns&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSVpv</font> <font color="4444FF">(</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">number</font>, <font color="#2040a0">small</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">number</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">)</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">number</font><font color="4444FF">)</font><font color="4444FF">;</font>
      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV_noinc</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">hash</font><font color="4444FF">)</font><font color="4444FF">;</font>

// прагма (?) RETVAL возвращает ссылку на хеш (perldoc perlguts).
  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
      <font color="#2040a0">RETVAL</font>

</pre>
Чтобы сделать модуль, который будет вызываться в perl-программе, нужно
сделать следующее:
<pre>
[vilfred@mobile100 xxx]$ h2xs -A -n Pixels
Defaulting to backwards compatibility with perl 5.8.3
If you intend this module to be compatible with earlier perl versions,
please
specify a minimum perl version with the -b option.

Writing Pixels/ppport.h
Writing Pixels/lib/Pixels.pm
Writing Pixels/Pixels.xs
Writing Pixels/Makefile.PL
Writing Pixels/README
Writing Pixels/t/Pixels.t
Writing Pixels/Changes
Writing Pixels/MANIFEST
[vilfred@mobile100 xxx]$
</pre>
Эта команда создаст каталог со всеми необходимыми для компиляции и
дальнейшего использования файлами. Т.к. компилирование c-шного файла
требовало подключения библиотек ImageMagick, то нужно подправить
Makefile.PL:
<pre>
    LIBS              => ['-L/usr/lib -lMagick -L/usr/X11R6/lib -lfreetype -lz \
-L/usr/lib -ltiff -lfreetype -ljpeg -lXext -lSM -lICE -lX11 -lXt \
-lbz2 -lz -lpthread -lm -lpthread'], # e.g., '-lm'

</pre>
<p align=justify>
После этого вносятся соответствующие правки в текст Pixels.xs и далее идут
команды perl Makefile.PL, make и make test. Т.к. модуль Pixels.pm не установлен (не было
команды make install), то необходимо вновь написанный модуль каким-то
образом вызвать в perl-скрипте. Nick Ing-Simmons написал библиотеку blib
(perldoc blib), которая находит необходимый модуль.<p>
Соответствующий perl-код <a href=xgui.pl>такой</a>,(с подсвеченным
синтаксисом 
<a href="xgui.html">html</a>).

Вобщем, что то в этом роде...
<p>
<center>
screenshot<p>
<img src="http://genphys.phys.msu.ru/%7Edmitriyk/site/mv/proga.jpg">
</center>
<p>
<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> | <a href=xs.html>Предыдущая</a> | Извлечение пикселей | to be continued...

<p>
]]></description>
</item>
</channel>
</rss>