MagickProducer.java
上传用户:qingzhou
上传日期:2013-04-21
资源大小:733k
文件大小:4k
源码类别:

破解

开发平台:

Java

  1. package magick;
  2. import java.awt.image.ImageProducer;
  3. import java.awt.image.ImageConsumer;
  4. import java.awt.image.DirectColorModel;
  5. import java.awt.Dimension;
  6. import java.util.Vector;
  7. import magick.MagickImage;
  8. import magick.MagickException;
  9. /**
  10.  * This class implements the ImageProducer class.
  11.  * It reads the pixels off a MagickImage and sends
  12.  * the pixels to the specified ImageConsumer.
  13.  *
  14.  * @author Eric Yeo
  15.  */
  16. public class MagickProducer
  17.     extends Magick
  18.     implements ImageProducer {
  19.     /**
  20.      * This keeps a copy of the image.
  21.      */
  22.     private MagickImage image = null;
  23.     private Vector consumers = null;
  24.     /**
  25.      * Constructor.
  26.      *
  27.      * @param image the MagickImage to produce an Image from
  28.      */
  29.     public MagickProducer(MagickImage image)
  30.     {
  31. this.image = image;
  32. consumers = new Vector();
  33.     }
  34.     /**
  35.      * This method is used to register an ImageConsumer with the
  36.      * ImageProducer for access to the image data during a later
  37.      * reconstruction of the Image.
  38.      *
  39.      * @param consumer to register with the producer
  40.      */
  41.     public void addConsumer(ImageConsumer consumer)
  42.     {
  43. if (consumer != null && !consumers.contains(consumer)) {
  44.     consumers.addElement(consumer);
  45. }
  46.     }
  47.     /**
  48.      * This method determines if a given ImageConsumer object is
  49.      * currently registered with this ImageProducer as one of its
  50.      * consumers.
  51.      *
  52.      * @param consumer to consumer to register with the producer
  53.      */
  54.     public boolean isConsumer(ImageConsumer consumer)
  55.     {
  56. return consumers.contains(consumer);
  57.     }
  58.     /**
  59.      * This method removes the given ImageConsumer object from the
  60.      * list of consumers currently registered to receive image data.
  61.      * It is not considered an error to remove a consumer that is
  62.      * not currently registered.
  63.      *
  64.      * @param consumer the consumer to check for registration
  65.      */
  66.     public void removeConsumer(ImageConsumer consumer)
  67.     {
  68. consumers.removeElement(consumer);
  69.     }
  70.     /**
  71.      * This method both registers the given ImageConsumer object
  72.      * as a consumer and starts an immediate reconstruction of the
  73.      * image data which will then be delivered to this consumer and
  74.      * any other consumer which may have already been registered
  75.      * with the producer.
  76.      *
  77.      * @param consumer to be registered before producing the image
  78.      */
  79.     public void startProduction(ImageConsumer consumer)
  80.     {
  81. addConsumer(consumer);
  82. // Get the pixels from the image
  83. Dimension dim;
  84. int size;
  85. byte[] pixels;
  86. try {
  87.     dim = image.getDimension();
  88.     size = dim.width * dim.height;
  89.     pixels = new byte[size*4];
  90.     image.dispatchImage(0, 0, dim.width, dim.height, "RGBA", pixels);
  91. }
  92. catch(MagickException ex) {
  93.     for (int i = 0; i < consumers.size(); i++) {
  94. ImageConsumer aConsumer =
  95.     (ImageConsumer) consumers.elementAt(i);
  96. aConsumer.imageComplete(ImageConsumer.IMAGEERROR);
  97.     }
  98.     return;
  99. }
  100. // Set the pixels in the consumers
  101. int[] img = new int[size];
  102. DirectColorModel cmodel =
  103.     new DirectColorModel(32,
  104.  255 << 24,
  105.  255 << 16,
  106.  255 << 8,
  107.  255);
  108. for (int i = 0; i < size; i++) {
  109.     img[i] =
  110. ((pixels[i*4] & 255) << 24) |
  111. ((pixels[i*4+1] & 255) << 16) |
  112. ((pixels[i*4+2] & 255) << 8) |
  113.                 (pixels[i*4+3] & 255);
  114. }
  115. for (int i = 0; i < consumers.size(); i++) {
  116.     ImageConsumer aConsumer =
  117. (ImageConsumer) consumers.elementAt(i);
  118.     aConsumer.setHints(ImageConsumer.TOPDOWNLEFTRIGHT|
  119.       ImageConsumer.COMPLETESCANLINES|
  120.       ImageConsumer.SINGLEPASS|
  121.       ImageConsumer.SINGLEFRAME);
  122.     aConsumer.setDimensions(dim.width, dim.height);
  123.     aConsumer.setPixels(0, 0, dim.width, dim.height,
  124. cmodel,
  125. img,
  126. 0,
  127. dim.width);
  128.     aConsumer.imageComplete(ImageConsumer.STATICIMAGEDONE);
  129. }
  130.     }
  131.     /**
  132.      * This method is used by an ImageConsumer to request that the
  133.      * ImageProducer attempt to resend the image data one more time
  134.      * in TOPDOWNLEFTRIGHT order so that higher quality  conversion
  135.      * algorithms which depend on receiving pixels in order can be
  136.      * used to produce a better output version of the image.
  137.      *
  138.      * @param consumer the consumer to register before producing the image
  139.      */
  140.     public void requestTopDownLeftRightResend(ImageConsumer consumer)
  141.     {
  142. startProduction(consumer);
  143.     }
  144. }