2016-10-22 4 views
0

jpeg 이미지를 무손실로 저장해야합니다. 저는 스테 가노 프로젝트에 종사하지만 자바는 결과를 압축하고 저장합니다. 모든 포럼을 조사하고 모든 것을 시도하지만 작동하지 않습니다. 내가 PSNR 값이 28.53173과의 크기 "image.jpg를보다 크다"example.jpg "입니다 계산자바에서 무손실 jpg를 저장하는 방법?

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

ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next(); 
JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null); 

jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
jpegParams.setCompressionQuality(1f); 

writer.setOutput(ImageIO.createImageOutputStream(new File("example.jpg"))); 
writer.write(null, new IIOImage(image,null,null), jpegParams); 
writer.dispose(); 

이 과정 후 : 여기

무손실 내 예제 코드는 JPEG 이미지를 저장 ".

가져 오기 JAI 라이브러리를 사용해 보지만 Java 8이 JAI를 지원하는지 잘 모르겠습니다.

+0

왜 JPEG가 무손실인지 이해할 수 있도록 알고리즘에 대한 자세한 내용을 공유 할 수 있습니까? jpeg가 알고리즘에 적합한 형식이 아니거나 stego 이미지를 특정 방식으로 인코딩해야 할 수도 있습니다. 예를 들어 [here] (https://stackoverflow.com/questions/29677726/steganography-in-lossy-compression-java/29678676#29678676)를 읽으십시오. – Reti43

+0

먼저 답변 해 주셔서 감사합니다. 내 알고리즘은 매우 간단합니다. 커버리지 이미지, RGB to YCbCr, Y 공간을위한 8x8 블록, 모든 블록을위한 DCT, 중간 주파수의 최대 계수의 LSB를 설정하는 텍스트/이미지 메시지. 모든 IDCT 후, YCbCr을 RGB로 저장하고 저장하십시오. Android 애플리케이션에서이 작업을 수행해야하며 JPEG 쓰기 JPEG를 읽어야합니다. – vakkaya

+1

우리에게 보여줄 수있는 일부 출판물의 알고리즘을 기반으로 했습니까? JPEG를 읽는 경우 파일 데이터에서 픽셀을 재구성 할 필요가 없습니다. DCT 블록을 메모리에로드하고 알고리즘별로 수정 한 다음 출력 파일로 다시 인코딩하면됩니다. 그렇게하면 변환 및 양자화 단계가 포함 된 JPEG 형식의 모든 손실을 피할 수 있습니다. – Reti43

답변

2

JPEG는 항상 입니다. lossy입니다. 100 % 압축 품질에서도 약간의 정보 손실이 발생하지만 최소화 될 것입니다.

example.jpg의 크기가 더 큰 이유는 100 % 품질 계수로 인코딩 되었기 때문입니다. 반면 대부분의 JPEG 인코더에는 기본값 인 50-75 %가 사용되었습니다. 이는 가장 많이 사용 된 것입니다 example.jpg. 두 파일의 크기가 같은지 확인하려면 다양한 품질 요소를 사용해보십시오.

JAI에서 사용할 수있는 무손실 JPEG 형식이 있지만 기존의 JPEG과 다른 형식으로 간주되어야합니다. 그러나 널리 사용되지는 않으며 대부분의 응용 프로그램에서이 이미지를 볼 수 없으므로 무고한 이미지 공유의 이점을 거의 상실하게됩니다.

관련 문제