2014-01-23 2 views
0

В настоящее время я работаю над обработкой изображений на Java. Первоначально я использовал класс ImageIO написать изображенияКак читать байты изображения на Java?

ImageIO.write(image,"jpg",os); 

проблема с этим методом является утро Лоссинга фактического размера и качество. Тогда я предпочел потоковый

Files.readAllBytes(fi.toPath()); 

читать и

fos.write(fileContent); 

писать изображений. Это прекрасно работает. Проблема, с которой я столкнулся, - это читать только файлы, но не изображения (например, изображение BuffreredImage). Возможно ли читать изображение, а не файлы здесь, или я должен перейти к другому IO?

фрагмент кода здесь,

try { 

File fnew=new File("d:\\3\\IMG1.jpg"); 
java.io.FileOutputStream fos = new java.io.FileOutputStream(new    File("d:\\3\\Test1\\4.jpg")); 
File fi = new File("d:\\3\\7.jpg"); 
byte[] fileContent = Files.readAllBytes(fi.toPath()); 
fos.write(fileContent); 

} catch (Exception e) { 

System.out.println("Exception"); 
} 

Любой Вид предложения или помощь будет оценена. Заранее спасибо.

+0

Мой тип ввода Изображения только не файлы. :-( –

+0

вы можете отредактировать вопрос и добавить дополнительные сведения – lakshman

+0

@ Laxman - Я обрабатываю изображения (считывая изображения, меняя качество, изменяя его размер, устанавливая водяные знаки и, наконец, записывая его в пункт назначения). Проблема: если я использую ImageIO.write (), то я теряю фактическое качество изображения, когда пишу, поэтому перешел в FileOutputStream и прочитал байт []. Мой вопрос в том, есть ли возможность читать байты изображения при вводе изображения или мне нужно идти с другим IO? –

ответ

0

проблема с этим методом - потерять фактический размер и качество изображения. Затем я предпочел ByteStream

Когда вы читаете JPEG с помощью ImageIO, он автоматически преобразует JPEG в растровое изображение. Затем, когда вы пишете его, он снова кодируется в формате JPEG (который теряет качество).

Просто замените ImageIO.write(image,"jpg",os) на ImageIO.write(image,"png",os), и все готово. Формат без потерь, такой как PNG, не потеряет никаких данных при записи изображения.

+0

Мой выходной файл должен JPEG. Это проблема. В файле ImageIO.write(), возможно, нет записи JPG в формате lossless jpg. –

+0

@J_User Если JPEG без потерь не поддерживается, вы должны использовать другую библиотеку. Зачем нужен JPEG? Это практически * наихудший формат изображения. – Navin

0

BufferedImage getRGB() предоставит вам все фактические пиксельные данные для изображения. Не будет сжатия или чего-нибудь подобного JPEG. Это будет сырое изображение.

Edited добавить пример, основанный на мои комментарии ...

BufferedImage image = ImageIO.read(new File("google.jpg")); 
    ImageWriter w = ImageIO.getImageWritersBySuffix("jpg").next(); 
    ImageOutputStream out = ImageIO.createImageOutputStream(new File("output.jpg")); 
    w.setOutput(out); 
    ImageWriteParam param = new JPEGImageWriteParam(Locale.getDefault()); 
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    param.setCompressionQuality(1); 
    w.write(null, new IIOImage(image, null, null), param); 
    out.close(); 
+0

Файл JPEG не сохраняет RGB-пиксели. Будет некоторая ошибка от DCT. При записи изображения он должен использовать формат без потерь. – Navin

+0

Если качество является единственной проблемой (не сырые данные), вы должны использовать ImageIO для получения ImageWriter, а затем использовать ImageWriterParam для установки качества. –

+0

Как я писал в другом комментарии к ответу (теперь удален?), Нет никакого способа написать JPEG без потери качества. Если оригинал был JPEG, вы могли бы теоретически получить сжатие без потерь без потерь, используя те же самые таблицы huffman. – haraldK

Смежные вопросы