2010-07-09 6 views
52

Я хочу преобразовать изображение в массив байтов и наоборот. Здесь пользователь вводит имя изображения (.jpg), а программа будет прочитает его из файла и преобразует его в массив байтов.Как преобразовать изображение в массив байтов в java?

+5

Скорее всего, не дубликат: вопросник означает сжатый файл изображения на растровый, а не как читать сжатые байты. –

+5

Согласитесь, это * не * дубликат отмеченного вопроса (по крайней мере, не со ссылкой на принятый ответ). Голосование для повторного открытия. – haraldK

+2

Это не дубликат, так как 'Файл' сильно отличается от' Image'. –

ответ

54

BufferedImage состоит из двух основных классов: Растр & ColorModel. Растер сам состоит из двух классов: DataBufferByte для содержимого изображения, а другой для цвета пикселя.

, если вы хотите, чтобы данные из DataBufferByte, используйте:

public byte[] extractBytes (String ImageName) throws IOException { 
// open image 
File imgPath = new File(ImageName); 
BufferedImage bufferedImage = ImageIO.read(imgPath); 

// get DataBufferBytes from Raster 
WritableRaster raster = bufferedImage .getRaster(); 
DataBufferByte data = (DataBufferByte) raster.getDataBuffer(); 

return (data.getData()); 
} 

теперь вы можете обработать эти байты, скрывая текст в LSB, например, или процесс его так, как вы хотите.

+0

Если изображение обрамлено коротким массивом (что было для меня и tif-изображением), это даст вам DataBufferShort, в результате чего исключение исключения – Karussell

+0

для этих классов мне нужны дополнительные банки? – praveen

+0

Нет, в Eclipse просто используйте Ctrl + Shift + o. – RichardK

2

java.io.FileInputStream является то, что вы ищете :-)

4

Заканчивать javax.imageio, особенно ImageReader и ImageWriter как абстракции для чтения и записи файлов изображений.

BufferedImage.getRGB(int x, int y), что позволяет получать значения RGB на заданном пикселе, который может быть помещен в байты.

Примечание: Я думаю, что вы не хотите читать необработанные байты, потому что тогда вам нужно иметь дело со всеми сжатиями/декомпрессиями.

0

Я думаю, что лучший способ сделать это, чтобы сначала прочитать файл в массив байтов, а затем преобразовать массив в изображение с ImageIO.read()

5

Попробуйте этот код

BufferedImage image = ImageIO.read(new File("filename.jpg")); 

// Process image 

ImageIO.write(image, "jpg", new File("output.jpg")); 
23
File fnew=new File("/tmp/rose.jpg"); 
BufferedImage originalImage=ImageIO.read(fnew); 
ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
ImageIO.write(originalImage, "jpg", baos); 
byte[] imageInByte=baos.toByteArray(); 
41

Если вы используете JDK 7 вы можете использовать следующий код ..

import java.nio.file.Files; 
import java.io.File; 

File fi = new File("myfile.jpg"); 
byte[] fileContent = Files.readAllBytes(fi.toPath()) 
4

Вот полная версия кода для этого. Я протестировал его. В основном есть класс BufferedImage и Base64. Также необходимо установить правильный параметр.

public class SimpleConvertImage { 
    public static void main(String[] args) throws IOException{ 
     String dirName="C:\\"; 
     ByteArrayOutputStream baos=new ByteArrayOutputStream(1000); 
     BufferedImage img=ImageIO.read(new File(dirName,"rose.jpg")); 
     ImageIO.write(img, "jpg", baos); 
     baos.flush(); 

     String base64String=Base64.encode(baos.toByteArray()); 
     baos.close(); 

     byte[] bytearray = Base64.decode(base64String); 

     BufferedImage imag=ImageIO.read(new ByteArrayInputStream(bytearray)); 
     ImageIO.write(imag, "jpg", new File(dirName,"snap.jpg")); 
    } 
} 

Reference link

4

Попробуйте этот код:

public class ImageTest { 

public static void main(String[] args) { 

    try { 

     byte[] imageInByte; 
     BufferedImage originalImage = ImageIO.read(new File(
       "c:/darksouls.jpg")); 

     // convert BufferedImage to byte array 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ImageIO.write(originalImage, "jpg", baos); 
     baos.flush(); 
     imageInByte = baos.toByteArray(); 
     baos.close(); 

     // convert byte array back to BufferedImage 
     InputStream in = new ByteArrayInputStream(imageInByte); 
     BufferedImage bImageFromConvert = ImageIO.read(in); 

     ImageIO.write(bImageFromConvert, "jpg", new File(
       "c:/new-darksouls.jpg")); 

    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 
} 
} 
0

Использование RandomAccessFile будет простым и удобным.

RandomAccessFile f = new RandomAccessFile(filepath, "r"); 
byte[] bytes = new byte[(int) f.length()]; 
f.read(bytes); 
f.close(); 
Смежные вопросы