2009-08-04 1 views
4

Я загружаю файл со строкой. У меня есть изображение как байт [], и я хотел бы его масштабировать.Масштабировать изображение, которое хранится как байт [] в Java

FormFile file = (FormFile) dynaform.get("file"); 
byte[] fileData = file.getFileData(); 
fileData = scale(fileData,200,200); 

public byte[] scale(byte[] fileData, int width, int height) { 
// TODO 
} 

Кто-нибудь знает простую функцию для этого?

public byte[] scale(byte[] fileData, int width, int height) { 
     ByteArrayInputStream in = new ByteArrayInputStream(fileData); 
     try { 
      BufferedImage img = ImageIO.read(in); 
      if(height == 0) { 
       height = (width * img.getHeight())/ img.getWidth(); 
      } 
      if(width == 0) { 
       width = (height * img.getWidth())/ img.getHeight(); 
      } 
      Image scaledImage = img.getScaledInstance(width, height, Image.SCALE_SMOOTH); 
      BufferedImage imageBuff = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
      imageBuff.getGraphics().drawImage(scaledImage, 0, 0, new Color(0,0,0), null); 

      ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

      ImageIO.write(imageBuff, "jpg", buffer); 

      return buffer.toByteArray(); 
     } catch (IOException e) { 
      throw new ApplicationException("IOException in scale"); 
     } 
    } 

Если вы бежите из Java Heap пространства в котом как я, увеличить пространство кучи, который используется котом. В случае, если вы используете котом плагин для Eclipse, следующий должен применяться:

В Eclipse выберите Window> Настройки> Tomcat> JVM Settings

Добавьте следующие строки в разделе JVM Параметры

-Xms256m -Xmx512m

+1

__Guessing here__: JPEG не делает прозрачность. Измените 'TYPE_INT_ARGB' на' TYPE_INT_RGB' и 'новый цвет (0,0,0,0)' на 'новый цвет (0,0,0)' –

+1

. Что касается места кучи, вы можете сэкономить некоторое пространство, работая напрямую на входном потоке вместо того, чтобы читать его в массив байтов. Однако для масштабирования изображения вам нужна копия (и его масштабированная версия) в памяти; поэтому вам просто нужно увеличить кучу пространства. Посмотрите на 'java -xmx'. –

ответ

18

Зависит от формата данных.

Однако, если вы используете что-то вроде JPEG, GIF, PNG или BMP, вы можете использовать класс ImageIO.

Что-то вроде:

public byte[] scale(byte[] fileData, int width, int height) { 
     ByteArrayInputStream in = new ByteArrayInputStream(fileData); 
     try { 
      BufferedImage img = ImageIO.read(in); 
      if(height == 0) { 
       height = (width * img.getHeight())/ img.getWidth(); 
      } 
      if(width == 0) { 
       width = (height * img.getWidth())/ img.getHeight(); 
      } 
      Image scaledImage = img.getScaledInstance(width, height, Image.SCALE_SMOOTH); 
      BufferedImage imageBuff = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
      imageBuff.getGraphics().drawImage(scaledImage, 0, 0, new Color(0,0,0), null); 

      ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

      ImageIO.write(imageBuff, "jpg", buffer); 

      return buffer.toByteArray(); 
     } catch (IOException e) { 
      throw new ApplicationException("IOException in scale"); 
     } 
    } 
+0

Пожалуйста, обновите свой код с помощью проверенного кода, опубликованного мной в моем вопросе. Я очищу вопрос и приму ваш ответ. –

+1

@ Кевин Монтроуз не должен закрывать открытые потоки после изменения размера? –

+0

Ссылка ImageIO теперь недоступна. Я хочу знать зависимость. Пожалуйста, дайте мне знать, если он все еще функционирует. – User1230321