복붙노트

[SCALA] ImageIO.write를 사용하여 품질 손실

SCALA

ImageIO.write를 사용하여 품질 손실

나는 자동으로 압축을 해제 할 수있는 방법, ImageIO.write을 사용하여 상당한 품질의 손실을 noticied있다?

val baos: ByteArrayOutputStream = new ByteArrayOutputStream
val newBi = new BufferedImage(img.getWidth, img.getHeight, BufferedImage.TYPE_INT_RGB)
val gr = newBi.createGraphics()
gr.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), Color.WHITE, null)
ImageIO.write(newBi, "jpeg", baos)
val b = baos.toByteArray
baos.close()

해결법

  1. ==============================

    1.사용의 ImageWriter.

    사용의 ImageWriter.

    ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
    ImageWriteParam param = writer.getDefaultWriteParam();
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // Needed see javadoc
    param.setCompressionQuality(1.0F); // Highest quality
    writer.write(image);
    

    비 사진 이미지는 .PNG를 사용합니다.

    @PiotrekDe 댓글을 달았습니다, 다음은 더 논리적 인 것 같다.

    writer.write(null, new IIOImage(image, null, null), param)
    
  2. ==============================

    2.스칼라에서 https://github.com/sksamuel/scrimage를 사용하여 당신은 사진과에 압축 수준을 설정할 수 있습니다

    스칼라에서 https://github.com/sksamuel/scrimage를 사용하여 당신은 사진과에 압축 수준을 설정할 수 있습니다

    val in = // some input stream or byte array
    val out = // some output stream etc
    Image(in).writer(Format.JPEG).withCompression(1.0).write(out)
    

    당신은 압축 수준 0과 1.0 사이의 값을 설정할 수 있습니다.

  3. ==============================

    3.JPEG 이미지는 손실 압축을 사용한다. 사용 대신에 PNG로. 그것도 있지만, 무손실 알고리즘으로 압축합니다.

    JPEG 이미지는 손실 압축을 사용한다. 사용 대신에 PNG로. 그것도 있지만, 무손실 알고리즘으로 압축합니다.

  4. ==============================

    4.JPEG 압축은 손실이다. 그러나 PNG 압축 무손실입니다. 그래서, PNG 형식으로 쓰기에 좋습니다. 즉, 당신은 PNG 형식으로 압축 할 경우에도 손실 품질하지 않습니다. 간단한 라인 :

    JPEG 압축은 손실이다. 그러나 PNG 압축 무손실입니다. 그래서, PNG 형식으로 쓰기에 좋습니다. 즉, 당신은 PNG 형식으로 압축 할 경우에도 손실 품질하지 않습니다. 간단한 라인 :

    ImageIO.write(newBI,"png",someOutputStream);
    

    당신이 품질 JPG 형식을 원한다면, 100 % 품질을 설정합니다. 다음 코드를 도움이 될 수 있습니다.

        ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
        ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam();
        jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        jpgWriteParam.setCompressionQuality(1f);
        jpgWriter.setOutput(someOutputStream);
         //better to use ImageOutputStream
        jpgWriter.write(null,new IIOImage(yourImage, null, null), jpgWriteParam);
    
  5. from https://stackoverflow.com/questions/17015197/quality-loss-using-imageio-write by cc-by-sa and MIT license