Подтвердить что ты не робот

Как преобразовать буферное изображение в изображение и наоборот?

На самом деле я работаю над программным обеспечением для редактирования изображений, и теперь я хочу преобразовать буферизованное изображение i.e:

  BufferedImage buffer = ImageIO.read(new File(file));

to Image i.e в формате что-то вроде:

  Image image  = ImageIO.read(new File(file));

Можно ли так?? Если да, то как?

4b9b3361

Ответ 1

BufferedImage - это (n) образ, поэтому неявный бросок, который вы делаете во второй строке, может быть скомпилирован напрямую. Если бы вы знали, что изображение действительно было BufferedImage, вам нужно было бы его явно указывать так:

Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;

Поскольку BufferedImage расширяет изображение, он может вставляться в контейнер Image. Тем не менее, любое изображение может поместиться там, включая те, которые не являются BufferedImage, и поэтому вы можете получить ClassCastException во время выполнения, если тип не совпадает, поскольку BufferedImage не может содержать какой-либо другой тип, если он не расширяет BufferedImage.

Ответ 2

Пример: скажем, у вас есть "образ", который вы хотите масштабировать, вам понадобится BufferedImage, вероятно, и, вероятно, начнется с объекта "Image". Так что это работает, я думаю... AVATAR_SIZE - это ширина цели, которой мы хотим, чтобы наш образ был:

Image imgData = image.getScaledInstance(Constants.AVATAR_SIZE, -1, Image.SCALE_SMOOTH);     

BufferedImage bufferedImage = new BufferedImage(imgData.getWidth(null), imgData.getHeight(null), BufferedImage.TYPE_INT_RGB);

bufferedImage.getGraphics().drawImage(imgData, 0, 0, null);

Ответ 3

BufferedImage является подклассом Image. Вам не нужно делать никаких преобразований.

Ответ 4

Вы можете попробовать сохранить (или записать) Буферизированное изображение с внесенными вами изменениями и затем открыть его как изображение.

EDIT:

try {
    // Retrieve Image
    BufferedImage buffer = ImageIO.read(new File("old.png"));;
    // Here you can rotate your image as you want (making your magic)
    File outputfile = new File("saved.png");
    ImageIO.write(buffer, "png", outputfile); // Write the Buffered Image into an output file
    Image image  = ImageIO.read(new File("saved.png")); // Opening again as an Image
} catch (IOException e) {
    ...
}

Ответ 5

Просто информация: давайте все помнить, что класс Image на самом деле является абстрактным классом и ссылается на переменную этого с BufferedImage только сохраняет или возвращает любой адрес памяти объекта.

Кроме того, статический метод java.awt.image.imageIO read() возвращает объект BufferedImage, поэтому, без сомнения, использование оператора/выражения instanceof BufferedImage на этом объекте вернет true.

Фактически, будучи абстрактным, класс Image имеет такие сигнатуры метода, как:

  • public abstract Graphics getGraphics()
  • public abstract ImageProducer getSource()

среди прочих.

Я подчеркиваю, что фактическая переменная Image содержит только адрес памяти конкретного объекта-подкласса Image, почти как указатели в C, С++, Ada и т.д.

Если вы введены или расширены на этих языках, а также экземпляры интерфейса Java, такие как Runnable, javax.sound.Clip, AWT Shape и т.д. Обратите внимание, что Image имеет: public abstract Image getScaledInstance(...) - вы получаете точку. (Конечно, масштабирование в 2D графическом программировании является взаимозаменяемым для изменения размера, для чего необходима точность).

Но в невозможном случае, когда здесь метод ImageIO возвращает ! (instanceof BufferedImage), просто создайте новый объект BufferedImage с этим ImgObjNotInstncfBufImg, связанным с одним из его аргументов конструктора. Тогда, при (рациональном) будет манипулировать этим в логике вашего кода.

В любом случае класс Affin Transform подходит для преобразования фигур и изображений в масштабированные, повернутые, перемещенные и т.д. формы, поэтому я рекомендую вам изучить использование "аффинного преобразования".

Обратите внимание, что вы можете манипулировать фактическими пикселями в таком растровом изображении - ну, а другой технический графический графический графический графический редактор, на который нужно ссылаться из технического глоссария, - который, возможно, может быть использован в Java-способах бинарных действий в виде двойных операций в типах буферов изображений, которые хранят отдельные атрибуты цвета в компактном 32-байтном формате - по 7 бит для значений альфа и RGB.

Я подозреваю, что ты собираешься использовать его в слоях изображений. Итак, НАКОНЕЦ, рациональным является то, что вы ссылаетесь только на BufferedImage с абстрактным изображением, и если ваш объект Image не является BufferedImage еще одним, тогда вы можете просто сделать изображение из этого связанного, но -non-BufferedImage-instance, не беспокоясь о каком-либо преобразовании, литье, autoboxing или что-то еще; манипулирование BufferedImage на самом деле означает манипулирование также базовым объектом Image, несущим данные, на который он указывает.

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

Ответ 6

Правильный способ - использовать SwingFXUtils.toFXImage(bufferedImage,null) для преобразования BufferedImage в экземпляр JavaFX Image и SwingFXUtils.fromFXImage(image,null) для обратной операции.

Опционально второй параметр может быть WritableImage, чтобы избежать дальнейшего размещения объекта.