⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program examples.htm

📁 是一部关于java高级图像处理的的一本入门书
💻 HTM
📖 第 1 页 / 共 2 页
字号:
                 if (!(arg instanceof Integer)) {
                     return false;
                 }
             }
             return true;
         }
     }
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TD rowspan="7" colspan="1"><PRE>     // SampleOpImage is an extension of PointOpImage that takes two
     // integer parameters and one source and performs a modified
     // threshold operation on the given source.
     class SampleOpImage extends PointOpImage {
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TD rowspan="3" colspan="1"><PRE>         private int param1;
         private int param2;
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TD rowspan="3" 
  colspan="1"><PRE>     // A dummy constructor used by the class loader. */
         public SampleOpImage() {}
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TD rowspan="18" 
  colspan="1"><PRE>     /** Constructs an SampleOpImage. The image dimensions are copied
     *  from the source image.  The tile grid layout, SampleModel, and
     *  ColorModel may optionally be specified by an ImageLayout
     *  object.
     *
     * @param source    a RenderedImage.
     * @param layout    an ImageLayout optionally containing the tile
     *                  grid layout, SampleModel, and ColorModel, or
     *                  null.
     */
         public SampleOpImage(RenderedImage source,
                              ImageLayout layout,
                              Integer param1,
                              Integer param2) {
             super(source, null, layout, true);
             this.param1 = param1.intValue();
             this.param2 = param2.intValue();
         }
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TD rowspan="18" colspan="1"><PRE>     /**
     * Performs a modified threshold operation on the pixels in a
     * given rectangle.  Sample values below a lower limit are clamped
     * to 0, while those above an upper limit are clamped to 255.  The
     * results are returned in the input WritableRaster dest.  The
     * sources are cobbled.
     *
     * @param sources   an array of sources, guarantee to provide all
     *                necessary source data for computing the rectangle.
     * @param dest   a tile that contains the rectangle to be computed.
     * @param destRect the rectangle within this OpImage to be
     *                 processed.
     */
         protected void computeRect(Raster[] sources,
                                    WritableRaster dest,
                                    Rectangle destRect) {
             Raster source = sources[0];
             Rectangle srcRect = mapDestRect(destRect, 0);
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TD rowspan="8" colspan="1"><PRE>     // RasterAccessor is a convienient way to represent any given 
     // Raster in a usable format.  It has very little overhead if
     // the underlying Raster is in a common format (PixelSequential
     // for this release) and allows generic code to process
     // a Raster with an exotic format.  Essentially, it allows the
     // common case to processed quickly and the rare case to be
     // processed easily.
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TD 
  rowspan="3" colspan="1"><PRE>     // This "best case" formatTag is used to create a pair of 
     // RasterAccessors for processing the source and dest rasters
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TD rowspan="7" 
  colspan="1"><PRE>     RasterFormatTag[] formatTags = getFormatTags();
     RasterAccessor srcAccessor = 
        new RasterAccessor(sources[0], srcRect, formatTags[0],
                           getSource(0).getColorModel());
     RasterAccessor dstAccessor = 
        new RasterAccessor(dest, destRect, formatTags[1],
                           getColorModel());
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TD rowspan="19" colspan="1"><PRE>     // Depending on the base dataType of the RasterAccessors,
     // either the byteLoop or intLoop method is called.  The two
     // functions are virtually the same, except for the data type
     // of the underlying arrays.
             switch (dstAccessor.getDataType()) {
             case DataBuffer.TYPE_BYTE:
                 byteLoop(srcAccessor,dstAccessor);
                 break;
             case DataBuffer.TYPE_INT:
                 intLoop(srcAccessor,dstAccessor);
                 break;
             default:
                 String className = this.getClass().getName();
                 throw new RuntimeException(className + 
                                          " does not implement computeRect" + 
                                      " for short/float/double data");
             }
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TD rowspan="9" colspan="1"><PRE>     // If the RasterAccessor object set up a temporary buffer for the 
     // op to write to, tell the RasterAccessor to write that data
     // to the raster now that we're done with it.
             if (dstAccessor.isDataCopy()) {
                 dstAccessor.clampDataArrays();
                 dstAccessor.copyDataToRaster();
             }
         }
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TD rowspan="12" colspan="1"><PRE>     /**
     * Computes an area of a given byte-based destination Raster using
     * a souce RasterAccessor and a destination RasterAccesor.
     * Processing is done as if the bytes are unsigned, even though
     * the Java language has support only for signed bytes as a
     * primitive datatype.
     */
     private void byteLoop(RasterAccessor src, RasterAccessor dst) {
             int dwidth = dst.getWidth();
             int dheight = dst.getHeight();
             int dnumBands = dst.getNumBands();
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TD 
  rowspan="5" colspan="1"><PRE>             byte dstDataArrays[][] = dst.getByteDataArrays();
             int dstBandOffsets[] = dst.getBandOffsets();
             int dstPixelStride = dst.getPixelStride();
             int dstScanlineStride = dst.getScanlineStride();
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TD rowspan="4" colspan="1"><PRE>             byte srcDataArrays[][] = src.getByteDataArrays(); 
             int srcBandOffsets[] = src.getBandOffsets();
             int srcPixelStride = src.getPixelStride();
             int srcScanlineStride = src.getScanlineStride();
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TD 
  rowspan="2" colspan="1"><PRE>             byte bp1 = (byte)(param1 &amp; 0xff);
             byte bp2 = (byte)(param2 &amp; 0xff);
</PRE><TR valign="top"><TR valign="top"><TD rowspan="11" colspan="1"><PRE>             // A standard imaging loop
             for (int k = 0; k &lt; dnumBands; k++)  {
                 byte dstData[] = dstDataArrays[k];
                 byte srcData[] = srcDataArrays[k];
                 int srcScanlineOffset = srcBandOffsets[k];
                 int dstScanlineOffset = dstBandOffsets[k];
                 for (int j = 0; j &lt; dheight; j++)  {
                     int srcPixelOffset = srcScanlineOffset;
                     int dstPixelOffset = dstScanlineOffset;
                     for (int i = 0; i &lt; dwidth; i++)  {
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TD rowspan="14" colspan="1"><PRE>     // This code can be specialized by rewriting the 
     // following block of code to do some other 
     // operation.
     //
     //  Some examples:
     //   InvertOp:
     //      dstData[dstPixelOffset] = 
     //        (byte)(0xff &amp; ~srcData[srcPixelOffset]);
     //
     //   AddConst:
     //      dstData[dstPixelOffset] = 
     //        (byte)(0xff &amp; (srcData[srcPixelOffset]+param1));
     //
     //   Currently, the operation performs a threshold.
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TD rowspan="8" colspan="1"><PRE>                 int pixel = srcData[srcPixelOffset] &amp; 0xff;
                 if (pixel &lt; param1) {
                     dstData[dstPixelOffset] = 0; // bp1;
                 } else if (pixel &gt; param2) {
                     dstData[dstPixelOffset] = (byte)255; // bp2;
                 } else {
                     dstData[dstPixelOffset] = srcData[srcPixelOffset];
                 }
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TD 
  rowspan="8" colspan="1"><PRE>                         srcPixelOffset += srcPixelStride;
                         dstPixelOffset += dstPixelStride;
                     }
                     srcScanlineOffset += srcScanlineStride;
                     dstScanlineOffset += dstScanlineStride;
                 }
             }
         }
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TD><PRE>     /**
     * Computes an area of a given int-based destination Raster using
     * a source RasterAccessor and a destination RasterAccesor.
     */
     private void intLoop(RasterAccessor src, RasterAccessor dst) {
             int dwidth = dst.getWidth();
             int dheight = dst.getHeight();
             int dnumBands = dst.getNumBands();
</PRE><TR valign="top"><TD rowspan="4" colspan="1"><PRE>             int dstDataArrays[][] = dst.getIntDataArrays();
             int dstBandOffsets[] = dst.getBandOffsets();
             int dstPixelStride = dst.getPixelStride();
             int dstScanlineStride = dst.getScanlineStride();
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TD 
  rowspan="4" colspan="1"><PRE>             int srcDataArrays[][] = src.getIntDataArrays();
             int srcBandOffsets[] = src.getBandOffsets();
             int srcPixelStride = src.getPixelStride();
             int srcScanlineStride = src.getScanlineStride();
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TD 
  rowspan="26" colspan="1"><PRE>             for (int k = 0; k &lt; dnumBands; k++)  {
                 int dstData[] = dstDataArrays[k];
                 int srcData[] = srcDataArrays[k];
                 int srcScanlineOffset = srcBandOffsets[k];
                 int dstScanlineOffset = dstBandOffsets[k];
                 for (int j = 0; j &lt; dheight; j++)  {
                     int srcPixelOffset = srcScanlineOffset;
                     int dstPixelOffset = dstScanlineOffset;
                     for (int i = 0; i &lt; dwidth; i++)  {
                         int pixel = srcData[srcPixelOffset];
                         if (pixel &lt; param1) {
                            dstData[dstPixelOffset] = 0;
                         } else if (pixel &gt; param2) {
                            dstData[dstPixelOffset] = 255;
                         } else {
                      dstData[dstPixelOffset] = srcData[srcPixelOffset];
                         }
                         srcPixelOffset += srcPixelStride;
                         dstPixelOffset += dstPixelStride;
                     }
                     srcScanlineOffset += srcScanlineStride;
                     dstScanlineOffset += dstScanlineStride;
                 }
             }
         }
     }
</PRE><TR valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top"><TR valign="top"><TR valign="top"><TR valign="top"><TR 
  valign="top">
  <HR>

  <P>
  <P>
  <HR>
  <BR>
  <CENTER><A 
  href="http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/JAITOC.fm.html"><IMG 
  alt=Contents src="Program Examples.files/contents.gif"></A> <A 
  href="http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/Extension.doc.html"><IMG 
  alt=Previous src="Program Examples.files/previous.gif"></A> <A 
  href="http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/API-summary.doc.html"><IMG 
  alt=Next src="Program Examples.files/next.gif"></A> 
  <P><FONT size=5><I>Programming in Java Advanced Imaging</I></FONT> 
  </CENTER><BR>
  <H5><A 
  href="http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/copyright.html">Copyright</A> 
  &copy; 1999, Sun Microsystems, Inc. All rights reserved.</H5><!-- Last updated: Tue Nov 02 18:19:17 1999 --></BLOCKQUOTE>
<SCRIPT language=JavaScript 
src="Program Examples.files/s_code_remote.js"></SCRIPT>
</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -