태양의 사용을위한 적절한 교체 내부 com.sun.image.codec.jpeg 패키지?

StackOverflow https://stackoverflow.com/questions/1359904

  •  20-09-2019
  •  | 
  •  

문제

우리는이 오래된 내부 태양 패키지를 사용하여 이미지를 조작하기 위해이 오래된 내부 태양 패키지를 사용하는 코드가 차단되어 있으며, 입력 스트림에서 / 디코딩을 읽은 후 JPEG를 특정 크기와 품질로 인코딩합니다. 아래 코드 예. 적절한 Java.* 또는 Javax.* API를 사용하여 모범 사례 교체 예제에 감사드립니다.

private void encodeJPEG(BufferedImage bi, BufferedOutputStream out, float quality) throws
  ImageFormatException, IOException {
 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
 JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
 param.setQuality(quality, false);
 param.setDensityUnit(DENSITY_UNIT);
 param.setXDensity(DENSITY);
 param.setYDensity(DENSITY);
 encoder.setJPEGEncodeParam(param);
 encoder.encode(bi);
}


private void initJPEG(File jpegFile) throws FileNotFoundException, IOException,
  IOException {
FileInputStream inputStream = new FileInputStream(jpegFile);
try {
  JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(inputStream);
  buffImage = decoder.decodeAsBufferedImage();
}
.....error handling.....

}

도움이 되었습니까?

해결책

나는이 접근법을 시도하지 않았지만 당신은 Java 이미지 I/O API. 그만큼 JPEGIMAGEWRITEPARAM 클래스 특히 관심이 있습니다.

다른 팁

나는 동일한 문제가 있었는데, 나는이 테스트를 수행하여 인코딩의 차이를 측정하고 jpegcodec, imageio (매개 변수 없음), imageio (매개 변수 포함)로 파일에 쓰기에 씁니다.

    int numTest = 200;
    Robot robot = new Robot();
    BufferedImage image = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));

    //JPEGCODEC
    long t1 = System.currentTimeMillis();
    ByteArrayOutputStream ba = new ByteArrayOutputStream();
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(ba);
    JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
    param.setQuality(0.75f, false);
    encoder.setJPEGEncodeParam(param);

    File f = new File("TestJPEGCODEC");
    f.mkdir();
    for (int i = 0; i < numTest; i++) {
        encoder.encode(image);
        f = new File("TestJPEGCODEC\\test" + i + ".jpg");
        FileOutputStream fo = new FileOutputStream(f);
        fo.write(ba.toByteArray());
        fo.flush();
        ba.reset();

    }
    long t2 = System.currentTimeMillis();
    System.out.println("JPEGCODEC");
    System.out.println("Total time:: " + (t2 - t1) + " average time:: " + (t2 - t1) / numTest);

    //NORMAL IMAGEIO
    t1 = System.currentTimeMillis();
    f = new File("TestImageIO");
    f.mkdir();
    for (int i = 0; i < numTest; i++) {
        f = new File("TestImageIO\\test" + i + ".jpg");
        ImageIO.write(image, "jpg", f);
    }
    t2 = System.currentTimeMillis();
    System.out.println("ImageIO");
    System.out.println("Total time:: " + (t2 - t1) + " average time:: " + (t2 - t1) / numTest);

    Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName("jpg");
    ImageWriter writer = null;
    while (it.hasNext()) {
        writer = it.next();
    }
    //IMAGEIO EXPLICIT MODE
    t1 = System.currentTimeMillis();
    ImageWriteParam par = writer.getDefaultWriteParam();
    par.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    par.setCompressionQuality(0.75f);

    f = new File("TestImageIOExplicity");
    f.mkdir();
    for (int i = 0; i < numTest; i++) {
        f = new File("TestImageIOExplicity\\test" + i + ".jpg");
        FileImageOutputStream output = new FileImageOutputStream(f);
        writer.setOutput(output);
        IIOImage img = new IIOImage(image, null, null);
        writer.write(null, img, par);
        output.close();
    }

    t2 = System.currentTimeMillis();
    writer.dispose();
    System.out.println("IMAGEIOPAR");
    System.out.println("Total time:: " + (t2 - t1) + " average time:: " + (t2 - t1) / numTest);

내 결과 테스트 위의 코드는 MS에서 아래에 있습니다.

JPEGCODEC 
Total time:: 13750 average time:: 68
ImageIO
Total time:: 38906 average time:: 194
IMAGEIOPAR
Total time:: 43078 average time:: 215

나는 com.sun.image.codec.jpeg.jpegcodec을 사용해야한다는 것을 알고 있지만, 이런 종류의 결과를 사용하면 JPG를 인코딩/작성하는 데 imageio를 사용하여 현재 프로젝트에서 평균 인코딩의 차이점을 사용합니다. 그리고 글쓰기는 너무 커서 Jpegcodec을 사용하거나 동일한 효과를 위해 다른 외부 라이브러리를 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top