티스토리 뷰

반응형

※ 문제해결을 위해 이리저리 방법을 찾는 경로에 대해 기록한 것이고 일반적인 해결방법이 아닙니다.

    

1. 현상 : 이미지 업로드를 하고 썸네일을 생성하는데 썸네일 색상이 원본 이미지 색상과 달라짐.

              원본 파일에 붉은색 반전으로 넣은 듯이 색상이 달라짐.

 

2. 도움을 준 사이트

    1) https://stackoverflow.com/questions/9340569/jpeg-image-with-wrong-colors

 

JPEG image with wrong colors

I have a method that reads images, converts them (size, format) and writes them back. This always worked very well, but now I've come across some JPEG images (from a Press Agency) that obviously co...

stackoverflow.com

 

    2) https://stackoverflow.com/questions/20789043/image-changes-color-when-saved-with-java

 

Image changes color when saved with java

When I save this image: with this method: private final static Path ROOT_PATH = Paths.getPath("C:/images"); private static void saveImageFromWebSimple(final String url) { URL u = null; t...

stackoverflow.com

 

3. 문제해결 과정 (결론적으로 모두 실패했으니 skip하고 4번으로 가는 것 추천)

   1) 도움을 준 사이트 1)의 두번째 답변을 참고하여 MultipartFile을 읽는 부분에서 색변조가 일어나는 것이라고 생각.

       ImageIO.read(multipartFile.getInputStream());

       두번째 답변에 나오는 코드를 활용하여 이 부분을 대체할 방법을 시도.

       Image img = java.awt.Toolkit.getDefaultToolkit().createImage(multipartFile.getBytes());

   2) 그런데 Image를 BufferedImage로 변환시켜야 했다.

       그제야 Image를 바로 저장하는 방법은 없고 모든 파일 저장은  BufferedImage로부터 시작된다는 것을 깨달음

      https://stackoverflow.com/questions/13605248/java-converting-image-to-bufferedimage

       혹시나 간단하게 그냥 형변환으로 끝날 수 있지 않을까 기대하며...

       BufferedImage bi = (BufferedImage) img;

       이렇게 했더니 에러가 뿜! Error: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage

   3) 그래서 이 에러를 다시 서칭

      https://stackoverflow.com/questions/22426040/error-sun-awt-image-toolkitimage-cannot-be-cast-to-java-awt-image-bufferedimage

 

Error: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage

please help me cant do this thing to work to me sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage if (shape.hasImage()) { // If...

stackoverflow.com

       답변을 보면 위에 Image를 BufferedImage로 변환하는 방법에 대한 코드와 유사하다.

       그래서 이렇게 해보기로 결정.

    4) 그러나 아래 코드에서 다시 에러가 뿜!

        BufferedImage bi = new BufferedImage(Image.getWidth(null), Image.getHeight(null), BufferedImage.TYPE_INT_RGB);

        위에서 추출한 Image가 혹시 null인가 싶었지만 null은 아니었고

        에러메시지는 width와 height 값이 -1이라며 0보다 커야 한다는 블라블라....

    5) 그래서 width와 height 값을 직접 넣어주었다. 이 정도 노력을 보였으면 제발 성공해라!

        이후 나는 썸네일을 얻을 수 있었지만 색변조를 뛰어넘어 새카맣게 된 썸네일이 생성.

    6) 나는 포기하고 서칭하여 도움을 준 사이트 2)를 찾아갔다. 

        답변에 '불량JPEG'라는 말에 크게 위로받고... (이런 이미지를 업로드한 사람의 잘못이다! ㅎㅎㅎ)

        다시 힘을 내어 그래도 잘못된 이미지라는 것을 확인하는 방법 정도는 있지 않을까 싶어 다시 서칭 시작.

    7) 결국 도움을 준 사이트 1)로 되돌아가 첫번째 답변을 참고하기로 했다. 

        솔직히 이 답변은 뭔지 모르겠다 ㅠㅠ 그리고 생전 처음 보는 데이터형... 

        불량 JPEG 파일 하나 제대로 된 썸네일 만들어보겠다고 이렇게까지... 

        InputStream is = multipartFile.getInputStream();

        Iterator<ImageWriter> it = ImageIO.getImageWritersByMIMEType("image/jpeg");

        ImageReader reader = it.next();

        ImageInputStream iis = ImageIO.createImageInputStream(is);

        reader.setInput(iis, false, false);

        Image src = reader.read(0);

        내 목적은 BufferedImage를 구하는 것이기 때문에 여기까지만 뭔지도 모르고 베끼고

        나머지는 위에서 찾아봤던 Image를 BufferedImage로 변환하는 코드를 구현했다.

        이번엔... 되었을까?

    8) 그러나 이번에도 에러가 뿜! 

        Image src = reader.read(0); 부분에서 에러가 났는데

        에러메시지가 javax.imageio.IIOException: Not a JPEG file: starts with 0x89 0x50 였다.

        이게 뭘까. JPEG 파일이 아니라니!

        https://stackoverflow.com/questions/11310220/why-am-i-getting-the-error-not-a-jpeg-file-starts-with-0x89-0x50

 

Why am I getting the error: "Not a JPEG file: starts with 0x89 0x50"

Why am I getting the message "Not a JPEG file: starts with 0x89 0x50" when I try to open my jpg file?

stackoverflow.com

        답변을 보면 PNG 파일이라고 한다. 

    9) 썸네일 저장하는 코드 구현할 때 적어놓은 주석이 있는데

         ImageIO.write(BufferedImage, 확장자, ByteArrayOutputStream());

        이 코드로 썸네일을 저장할 때 썸네일 확장자를 'jpg'로 하여 png 파일을 저장하면 색변조가 일어난다고 써 있다.

        썸네일은 jpg로 만든다는 규칙이 있어서  png로 저장하고 파일명만 jpg 확장자로 만들었는데...

        내가 만든 똥이 나에게 돌아왔구나. 

        그러나 현재 담당자가 더 좋게 수정할 것을 믿으며 나는 이만...

 

4. 결론

    1) 업로드한 이미지 파일이 실제는 png파일이었다. 확장자를 png로 변경하여 업로드 해 보시라.

    2) 그럼에도 불구하고 이런 파일까지 끌어안고 싶다면 TwelveMonkeys라는 라이브러리를 사용해 보라는 답변이 많았다. 

        나는 사용했다가 프로젝트가 자꾸 다운되는 현상이 발생하여... (아마도 환경 문제인 것 같은데 원인을 찾지 못했다.) 제거해 버렸지만 좋은 라이브러리다.

        java 프로젝트에서 코드 변경 없이 라이브러리만 추가해서 사용할 수 있다.

 

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함