Оптимизирована генерация миниатюр


Вот фрагмент кода, который создает миниатюры из данного файла. Он хорошо работает, но гораздо медленнее, чем хотелось бы. Без использования внешней библиотеки (которые я стараюсь избегать в учебных целях), что можно сделать для увеличения скорости?

Я знаю самый быстрый способ для получения сохраненных эскизов. Я посмотрел в чтение на любую миниатюру данные EXIF на разбор встраиваемых информацию, но отказался, поскольку он принимает меня много усилий не готовый конечный результат. Опять же, я предпочитаю не полагаться на библиотеку специально, потому что я хочу узнать больше о самом формате.

Я знаю, что многие будут утверждать, что я не должна возиться с данные EXIF, если я использую внешнюю библиотеку, так в качестве альтернативы, что можно сделать конкретно в этом фрагменте, чтобы сделать вещи (значительно) быстрее?

Не стесняйтесь, чтобы дать мне обратную связь по поводу моего стиля кодирования, за исключением использования комментариев документации javadoc.

class ThumbIcon extends ImageIcon implements Runnable {
   public int    thumbWidth;
   public int    thumbHeight;

   Image         image;
   Graphics2D    g2dBuffer;
   ThumbButton   parent;
   BufferedImage scaledImage;

   public ThumbIcon(final ThumbButton theParent) {
      super();
      parent = theParent;
   } // End ThumbIcon(ThumbButton, String)

   public void run() {
                         image   = Toolkit.getDefaultToolkit().getImage(filePath);
      final MediaTracker tracker = new MediaTracker(new Container());
      tracker.addImage(image, 0);
      try {
         tracker.waitForID(0);
      } catch (InterruptedException e) {
         System.out.println("Interrupted getting thumb");
      } // End try

      // Get dimensions from the now-loaded image
      final int width   = image.getWidth(null);
      final int height  = image.getHeight(null);

      // Use the width to determine if the image is legitimate and loaded
      // Limit importable images to <54MiB or <51.5MP (9000px x 6000px)
      if ((width > 0) && (width * height < 54000000)) {
         // This is an actual image, so display on screen

         // Set the thumbnail size depending on image orientation
         // We are assuming a square thumbnail
         if (width > height) { // Landscape
            thumbWidth  = THUMBS_SIZE;
            thumbHeight = (int)((double)height / (double)width * THUMBS_SIZE);
         } else {              // Portrait
            thumbWidth  = (int)((double)width / (double)height * THUMBS_SIZE);
            thumbHeight = THUMBS_SIZE;
         } // End if

         scaledImage = new BufferedImage(thumbWidth, thumbHeight,
                                         BufferedImage.TYPE_INT_RGB);

         // Simultaneously load image into g2d buffer and scale to desired size
         g2dBuffer = scaledImage.createGraphics();
         g2dBuffer.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                                    RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);

         //g2dBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
         //                           RenderingHints.VALUE_ANTIALIAS_ON);

         // Size image (no matter initial size) to destWidth x destHeight
         g2dBuffer.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
         ...
         // Create the thumbnail
         setImage(Toolkit.getDefaultToolkit().createImage(scaledImage.getSource()));
         scaledImage.flush();
         image.flush();
         //g2dBuffer.finalize();
         g2dBuffer = null;
      } else {
         ...
      } // End if
   } // End run()
   ...
} // End ThumbIcon

Я сбрил некоторое время, отключив сглаживание. Это выглядит отвратительно, но он служит своей цели.



1247
6
задан 21 февраля 2011 в 10:02 Источник Поделиться
Комментарии