| <?xml version="1.0" encoding="utf-8" ?> |
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
| <title>Magick++ API: Working with Pixels </title> |
| <link rel="stylesheet" href="magick.css" type="text/css" /> |
| </head> |
| <body> |
| <div class="doc-section"> |
| <h1 align="center">Magick::Pixels</h1> |
| <p>The <i>Pixels</i> class provides efficient access to raw image |
| pixels. Image pixels (of type <a href="Quantum.html"><i>Quantum</i></a>) |
| may be accessed directly via the <i>Image Pixel Cache</i>. The image |
| pixel cache is a rectangular window (a view) into the actual image |
| pixels (which may be in memory, memory-mapped from a disk file, or |
| entirely on disk). Obtain existing image pixels via <i>get()</i>. |
| Create a new pixel region using <i>set().</i> </p> |
| <p>Depending on the capabilities of the operating system, and the |
| relationship of the window to the image, the pixel cache may be a copy |
| of the pixels in the selected window, or it may be the actual image |
| pixels. In any case calling <i>sync()</i> insures that the base image |
| is updated with the contents of the modified pixel cache. The method <i>decode()</i>supports |
| copying foreign pixel data formats into the pixel cache according to |
| the <i>QuantumTypes</i>. The method <i>encode()</i> supports copying |
| the pixels in the cache to a foreign pixel representation according to |
| the format specified by <i>QuantumTypes</i>. </p> |
| <p>Setting a view using the Pixels class does not cause the number of |
| references to the underlying image to be reduced to one. Therefore, in |
| order to ensure that only the current generation of the image is |
| modified, the Image's <a href="Image++.html#modifyImage">modifyImage()</a> |
| method should be invoked to reduce the reference count on the underlying |
| image to one. If this is not done, then it is possible for a previous |
| generation of the image to be modified due to the use of reference |
| counting when copying or constructing an Image. </p> |
| <p>The <i>Quantum</i>* returned by the <i>set</i> and <i>get</i> |
| methods, and the <i>void</i>* returned by the <i>indexes</i> |
| method point to pixel data managed by the <i>Pixels</i> class. The <i>Pixels</i> |
| class is responsible for releasing resources associated with the pixel |
| view. This means that the pointer should never be passed to delete() or |
| free(). </p> |
| <p style="margin-bottom: 0cm;">The pixel view is a small image in which |
| the pixels may be accessed, addressed, and updated, as shown in the |
| following example, which produces an image similar to the one on the |
| right (minus lines and text): </p> |
| <p class="image"><img class="icon" src="Cache.png" name="Graphic1" align="bottom" width="254" border="0" /></p> |
| <div class="viewport"> |
| #include <Magick++.h> |
| #include <iostream> |
| |
| using namespace std; |
| using namespace Magick; |
| int main(int argc,char **argv) |
| { |
| InitializeMagick(*argv); |
| |
| // Create base image |
| Image image(Geometry(254,218), "white"); |
| |
| |
| // Set the image type to TrueColor DirectClass representation. |
| image.type(TrueColorType); |
| // Ensure that there is only one reference to underlying image |
| // If this is not done, then image pixels will not be modified. |
| image.modifyImage(); |
| |
| // Allocate pixel view |
| Pixels view(image); |
| |
| // Set all pixels in region anchored at 38x36, with size 160x230 to green. |
| size_t columns = 196; size_t rows = 162; |
| Color green("green"); |
| Quantum *pixels = view.get(38,36,columns,rows); |
| for ( ssize_t row = 0; row < rows ; ++row ) |
| for ( ssize_t column = 0; column < columns ; ++column ) |
| { |
| *pixels++=QuantumRange*green.quantumRed(); |
| *pixels++=QuantumRange*green.quantumGreen(); |
| *pixels++=QuantumRange*green.quantumBlue(); |
| } |
| |
| // Save changes to image. |
| view.sync(); |
| |
| // Set all pixels in region anchored at 86x72, with size 108x67 to yellow. |
| columns = 108; rows = 67; |
| Color yellow("yellow"); |
| pixels = view.get(86,72,columns,rows); |
| for ( ssize_t row = 0; row < rows ; ++row ) |
| for ( ssize_t column = 0; column < columns ; ++column ) |
| { |
| *pixels++=QuantumRange*yellow.quantumRed(); |
| *pixels++=QuantumRange*yellow.quantumGreen(); |
| *pixels++=QuantumRange*yellow.quantumBlue(); |
| } |
| view.sync(); |
| |
| // Set pixel at position 108,94 to red |
| Color red("red"); |
| pixels = view.get(108,94,1,1); |
| *pixels++=QuantumRange*red.quantumRed(); |
| *pixels++=QuantumRange*red.quantumGreen(); |
| *pixels++=QuantumRange*red.quantumBlue(); |
| |
| // Save changes to image. |
| view.sync(); |
| image.write( "logo.png" ); |
| } |
| </div> |
| <p style="margin-bottom: 0cm;"><i>Pixels</i> supports the following |
| methods: </p> |
| <p align="center" style="margin-bottom: 0cm;"><b>Pixel Cache Methods</b></p> |
| <table width="100%" border="1" cellpadding="2" cellspacing="2"> |
| <tbody> |
| <tr> |
| <td> |
| <p align="center"><b>Method</b></p> |
| </td> |
| <td> |
| <p align="center"><b>Returns</b></p> |
| </td> |
| <td> |
| <p align="center"><b>Signature</b></p> |
| </td> |
| <td> |
| <p align="center"><b>Description</b></p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"><a name="get"></a><font size="2">get</font></p> |
| </td> |
| <td> |
| <p><font size="2"><a href="Quantum.html">Quantum</a>*</font></p> |
| </td> |
| <td> |
| <p><font size="2">const ssize_t x_, const ssize_t y_, const size_t |
| columns_, const size_t rows_</font></p> |
| </td> |
| <td> |
| <p><font size="2">Transfers read-write pixels from the image to |
| the pixel cache as defined by the specified rectangular region. |
| Modified pixels may be subsequently transferred back to the image |
| via <i>sync</i>. The value returned is intended for pixel access |
| only. It should never be deallocated.</font></p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"><a name="getConst"></a><font size="2">getConst</font></p> |
| </td> |
| <td> |
| <p><font size="2">const <a href="Quantum.html">Quantum</a>*</font></p> |
| </td> |
| <td> |
| <p><font size="2">const ssize_t x_, const ssize_t y_, const size_t |
| columns_, const size_t rows_</font></p> |
| </td> |
| <td> |
| <p><font size="2">Transfers read-only pixels from the image to |
| the pixel cache as defined by the specified rectangular region.</font></p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"><a name="set"></a><font size="2">set</font></p> |
| </td> |
| <td> |
| <p><font size="2"><a href="Quantum.html">Quantum</a>*</font></p> |
| </td> |
| <td> |
| <p><font size="2">const ssize_t x_, const ssize_t y_, const size_t |
| columns_, const size_t rows_</font></p> |
| </td> |
| <td> |
| <p><font size="2">Allocates a pixel cache region to store image |
| pixels as defined by the region rectangle. This area is |
| subsequently transferred from the pixel cache to the image via <i>sync</i>. |
| The value returned is intended for pixel access only. It should |
| never be deallocated.</font></p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"><a name="sync"></a><font size="2">sync</font></p> |
| </td> |
| <td> |
| <p><font size="2">void</font></p> |
| </td> |
| <td> |
| <p><font size="2">void</font></p> |
| </td> |
| <td> |
| <p><font size="2">Transfers the image cache pixels to the image.</font></p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"><a name="indexes"></a><font size="2">indexes</font></p> |
| </td> |
| <td> |
| <p><font size="2">void*</font></p> |
| </td> |
| <td> |
| <p><font size="2">void</font></p> |
| </td> |
| <td> |
| <p><font size="2">Returns the PsuedoColor pixel indexes |
| corresponding to the pixel region defined by the last <a href="Pixels.html#get">get</a> |
| , <a href="Pixels.html#getConst">getConst</a>, or <a href="Pixels.html#set">set</a> |
| call. Only valid for PseudoColor and CMYKA images. The pixel |
| indexes (an array of type <i>void</i>, which is typedef <i>Quantum</i>, |
| which is itself typedef <i>unsigned char</i>, or <i>unsigned short</i>, |
| depending on the value of the <i>QuantumDepth </i>define) provide |
| the <span lang="en-US">colormap</span> index (see <a |
| href="Image++.html#colorMap">colorMap</a>) for each pixel in the |
| image. For CMYKA images, the indexes represent the black |
| channel. The value returned is intended for pixel access only. It |
| should never be deallocated.</font></p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"><a name="x"></a><font size="2">x</font></p> |
| </td> |
| <td> |
| <p><font size="2">int</font></p> |
| </td> |
| <td> |
| <p><font size="2">void</font></p> |
| </td> |
| <td> |
| <p><font size="2">Left ordinate of view</font></p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"><a name="y"></a><font size="2">y</font></p> |
| </td> |
| <td> |
| <p><font size="2">int</font></p> |
| </td> |
| <td> |
| <p><font size="2">void</font></p> |
| </td> |
| <td> |
| <p><font size="2">Top ordinate of view</font></p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"><a name="columns"></a><font size="2">columns</font></p> |
| </td> |
| <td> |
| <p><font size="2">size_t</font></p> |
| </td> |
| <td> |
| <p><font size="2">void</font></p> |
| </td> |
| <td> |
| <p><font size="2">Width of view</font></p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <p align="center"><a name="rows"></a><font size="2">rows</font></p> |
| </td> |
| <td> |
| <p><font size="2">size_t</font></p> |
| </td> |
| <td> |
| <p><font size="2">void</font></p> |
| </td> |
| <td> |
| <p><font size="2">Height of view</font></p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </body> |
| </html> |