JPEG кодировщик - установить качество из командной строки - PullRequest
0 голосов
/ 29 февраля 2012

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

Я бы хотел, чтобы пользователь мог установить качество кодирования в командной строке.Я попытался переименовать второй аргумент (100) в new JpegEncoder(image, 100, new FileOutputStream(args[1])); encoder.Compress(); в args[2], но это не сработало.

public class JPGencoder {

  public static void main ( String[] args ) {
  String[] names = ImageIO.getWriterFormatNames();
  BufferedImage image = null;
  JpegEncoder encoder = null; 

  try {
     image = ImageIO.read( new File( args[0] ) );
      System.err.println("Process image " + args[0]);
      System.err.println(image.toString());
  } catch (Exception e) { 
      System.err.println("Problems with image " + args[0]);
  }

  try {
     encoder = new JpegEncoder(image, 100, new FileOutputStream(args[1]));
     encoder.Compress();
  } catch (Exception e) {
      System.out.println("well that didn't work");
  }

}}

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

На основании этого определения JpegEncoder вторым аргументом конструктора JpegEncode является int.

Тип args[2] - это String, так что предположительно" не работает " Вы имеете в виду " не скомпилировал ".Чтобы преобразовать args[2] в int:

Integer.parseInt(args[2]);

Это выдаст NumberFormatException, если args[2] не является действительным int.

0 голосов
/ 29 февраля 2012

Нетрудно настроить сжатие / качество JPG с помощью ImageIO.Вот некоторые фрагменты, которые могут помочь вам начать.

private ImageWriteParam imageWriterParams;
private ImageWriter imageWriter;
File out = new File("some.jpg");
// ...

Iterator it = ImageIO.getImageWritersBySuffix("jpg");
// presume every iterator has precisely 1 writer
imageWriter = (ImageWriter)it.next();
imageWriterParams = imageWriter.getDefaultWriteParam();
if ( imageWriterParams.canWriteCompressed() ) {
    try {
        imageWriterParams.setCompressionMode( ImageWriteParam.MODE_EXPLICIT );
    } catch(Exception e) {
        e.printStackTrace();
    }
} else {
    logger.log(Level.WARNING, "ImageWriter cannot compress!");
}
imageWriterParams.setCompressionQuality(qualF);

FileImageOutputStream fios = new FileImageOutputStream(out);
imageWriter.setOutput(fios);
imageWriter.write(
    null,
    new IIOImage(image,null,null),
    imageWriterParams );
fios.flush();
fios.close();
...