Java 2D API усовершенствования в J2SE 5.0

Каждая новая версия стандартной версии платформы Java приносит больших и малых улучшений. Большинство людей слышали о всех крупных новых функций, таких как Generics или новой параллельной утилиты пакета. То, что люди не всегда слышим, о которых малые новыми функциями. Эти функции редко упоминается, потому что они полезны в меньшую аудиторию, чем некоторые из больших возможностей. Этот совет описываются некоторые из этих небольших усовершенствований Java 2D API добавили в J2SE 5.0. Что на самом деле происходит, когда вы использовать новые возможности, часто зависит от вашей операционной среды и вашим оборудованием. В некоторых случаях использование этих возможностей может обеспечить очень мало (если таковые имеются) выгоды.

Бикубический Интерполяция

Один Java 2D API укрепление связано с масштабирование изображения — это также влияет на ротацию и другие аффинных преобразований. RenderingHints класс имеет две константы, которые занимаются различными параметрами интерполяции: VALUE_INTERPOLATION_BILINEAR и VALUE_INTERPOLATION_BICUBIC. Установка KEY_INTERPOLATION намек на один из двух вариантов, сообщает операционной системе, что следовать определенным правилам при масштабировании изображения. До J2SE 5.0, два намека, полученные значения тот же результат. Поскольку RenderingHints просто намеками, они могут быть проигнорированы. В самом деле, бикубический настройка всегда игнорируется, а вместо этого, была использована билинейной интерполяции.

Если вы не знакомы с этими двумя вариантами интерполяции, оно помогает понять, что происходит, когда расширение масштабов изображения. Например, если делать все те новые пикселей в изображение масштабируется до взялось? С билинейной масштабирование пикселей исходить от 2×2 прямоугольник пикселей из исходного изображения, которые являются ближайшими к масштабной пиксель. Прямоугольник пикселей смешанного использования линейной функции в обоих X и Y. С бикубический масштабирования, они идут из области 4×4, который окружает масштабной пиксель. Прямоугольник пикселей смешанного использования кубической функции в обоих X и Y. Благодаря увеличенной площади и алгоритмической сложности, бикубический масштабирование стремится создать лучше выглядит изображение масштабируется, но ценой исполнения.

Почитается в J2SE 5.0, бикубический обстановке. Вы можете убедиться в этом, выполнив следующую программу испытаний. Когда вы запустите программу, указать файл изображения. Программа устанавливает RenderingHints с двумя постоянными, VALUE_INTERPOLATION_BILINEAR и VALUE_INTERPOLATION_BICUBIC, и сообщает о различиях алгоритм интерполяции (если таковые имеются). Первый запуск программы с JDK 1.4, а затем с JDK 5.0. Вы увидите, что различия алгоритма интерполяции сообщается только с новыми JDK.


   import java.awt.*;

   import java.awt.image.*;

   import java.io.*;

   import javax.swing.*;

   import javax.imageio.*;  

   

   public class Bicubic {

     public static void main(String args[]) throws IOException {

       if (args.length == 0) {

         System.err.println(

           "Provide image name on command line");

         System.exit(-1);

       }

       Image image = ImageIO.read(new File(args[0]));

       int w = image.getWidth(null);

       int h = image.getHeight(null);

       BufferedImage bilinear = new BufferedImage(2*w, 2*h,

         BufferedImage.TYPE_INT_RGB);

       BufferedImage bicubic = new BufferedImage(2*w, 2*h,

         BufferedImage.TYPE_INT_RGB);   

   

       Graphics2D bg = bilinear.createGraphics();

       bg.setRenderingHint(RenderingHints.KEY_INTERPOLATION,

         RenderingHints.VALUE_INTERPOLATION_BILINEAR);

       bg.scale(22);

       bg.drawImage(image, 00null);

       bg.dispose();   

   

       bg = bicubic.createGraphics();

       bg.setRenderingHint(RenderingHints.KEY_INTERPOLATION,

        RenderingHints.VALUE_INTERPOLATION_BICUBIC);

      bg.scale(22);

      bg.drawImage(image, 00null);

      bg.dispose();   

   

      for(int i=0; i<2*w; i++)

        for(int j=0; j<2*h; j++)

          if (bilinear.getRGB(i, j!= bicubic.getRGB(i, j))

            System.out.println("Interpolation algo differ");

    }

   

Для JDK 1.4 окружающей среды, нет выхода из Продолжительность программы:

> java Bicubic image.jpg
[No Output]

Для JDK 1.5 окружающую среду, каждый пиксель, который отличается сообщается.

> java Bicubic image.jpg
Interpolation algo differ
Interpolation algo differ
Interpolation algo differ
Interpolation algo differ
Interpolation algo differ
.... repeated many times

OpenGL ускорение

8 февраля 2005 Совет Технология описана на языке программирования Java обязательными для 3D-графики OpenGL API. В J2SE 5.0, есть несколько вариантов OpenGL для ускорения базовую функциональность 2D API. Возможные варианты "под одеялом", — они не требуют, чтобы пользователь знает, как программировать на OpenGL. По умолчанию, ускорение опция отключена. Чтобы включить эту опцию, установите sun.java2d.opengl системное свойство к истине. Если вы хотите подробно о выходе направил OpenGL основе трубопровода, используйте значение True (заглавные Т), а Т. Чтобы увидеть результаты, используя Java 2D демо-код, который поставляется вместе с JDK.

java -Dsun.java2d.opengl=True -jar Java2Demo.jar

Вы можете узнать больше об OpenGL-основана в трубопроводе.

Создание шрифтов

До J2SE 5.0, класс шрифта позволило создать TrueType шрифты из InputStream через CreateFont () метод:


   public static Font createFont(int fontFormat,

          InputStream fontStream)

где это FontFormat Font.TRUETYPE_FONT. J2SE 5.0 делает два изменения в этом поддержку. Во-первых, вы можете создать Adobe Type 1 шрифты. Во-вторых, вы можете создать шрифт непосредственно из файлового объекта с новыми CreateFont () метод подписи:


   public static Font createFont(int fontFormat, 

          File fontFile)

Если вы просто хотите шрифты, т. е. вы не хотите, чтобы создать их с любого из этих методов, вы можете скопировать файлы шрифтов в $ JREHOME / Lib / Fonts каталога. Они будут автоматически подхвачены Runtime Environment когда они установлены в этот каталог.

Image Ускорение

Последний набор новых функций Java 2D изучить изображение относится к ускорению. Эти характеристики зависят от основной поддержки в вашей системе. Если ваша система не поддерживает эти функции, они просто игнорируются.

Первая особенность ускорения изображения заносятся в буфер изображение кэширования. Видео память поддерживает кэширование управляемых изображения. В целом, программы, которые используют рода изображений, которые могут управляться, как правило, выполняют лучше, чем те, которые используют неуправляемые изображения. До J2SE 5.0, только образы, созданные с createImage () метод компонента или с createCompatibleImage () Метод GraphicsConfiguration находятся в ведении Java 2D осуществления. Сейчас все изображения, созданные с одним из конструкторов BufferedImage управляются Java 2D осуществления.

Еще одна новая функция ускорения изображение является способность контролировать аппаратное ускорение изображений. Заметим однако, что в J2SE 5.0, методы, используемые для управления аппаратными средствами ускорения изображения не в полном объеме. См. для более подробной информации.

Наличие этой поддержки зависит от платформы и типа содержимого изображений. Кроме того, на платформах Microsoft Windows, чтобы увидеть результаты, иногда необходимо установить sun.java2d.translaccel системное свойство к истине. Смотрите описание translaccel в дополнительной информации о флаге.

При создании Java программы, вы можете сообщить операционной системе, которую вы хотите оптимизировать отдельные изображения. Это можно сделать путем установления приоритетов, как система хранит отдельные образы в памяти ускоренного если это возможно. Ключевая фраза здесь ", если возможно". До J2SE 5.0, вы можете запросить VolatileImage объекты будут храниться в памяти, ускоренным. С J2SE 5.0, Вы также можете запросить, что регулярные объекты изображения помещаются там. И вы можете создать прозрачные объекты VolatileImage. Раньше можно было создать только непрозрачные Ones.

GetCapabilities () метод в настоящее время определяется как образ и VolatileImage — не только в VolatileImage. Этот метод может использоваться, чтобы обнаружить, если изображение в настоящее время ускорился. Вы можете также задать приоритет с ускорением setAccelerationPriority () метод, или определить свои приоритеты с getAccelerationPriority () метод. Когда его ускорение приоритетным равна нулю, попытки ускорить конкретные изображения являются инвалидами. Установление приоритетов является лишь намеком, хотя и осуществления JDK можно чести (или не чтит) он, как он считает нужным.

Для создания прозрачных объектов VolatileImage, воспользуйтесь одним из двух новых createCompatibleVolatileImage () методы:

  • createCompatibleVolatileImage(
    int width, int height, int transparency)
  • createCompatibleVolatileImage(
    int width, int height, ImageCapabilities caps,
    int transparency)

Резюме

В качестве платформы Java, продолжает расти, следите за все эти маленькие особенности, которые не получают столько внимания, как и большие. Маленькие вещи, такие, как общий принтер система Unix (CUPS) принтер поддержка Solaris и Linux, добавляются без лишней помпы. Если вам посчастливилось иметь принтер CUPS, новая функция очень важна. Обязательно прочитайте о выпуске ли новая функция является то, что вы так долго ждали. См. также описание.

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>