2014-09-28 2 views
1

그때, BYTEARRAY에 이미지를 변환 다음 코드로의 HttpServlet 클래스에서의 BufferedOutputStream를 사용하여 내 JSP 페이지에 인쇄하려고 :색상을 유지 BYTEARRAY에 이미지를 변환

public byte[] extractBytes(String imagePath) { 
     byte[] imageInByte = new byte[0]; 
     try { 
      ByteArrayOutputStream baos = null; 
      BufferedImage originalImage = ImageIO.read(new File(imagePath)); 

      baos = new ByteArrayOutputStream(); 
      ImageIO.write(originalImage, "jpg", baos); 
      baos.flush(); 
      imageInByte = baos.toByteArray(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return imageInByte; 
    } 

그것을 인쇄하려면 :

  imageInByte = extractBytes(requestedUrl); 

      response.setContentType(
      "image/jpeg"); 
      response.setContentLength(imageInByte.length); 

      response.setHeader(
      "Content-Disposition", "inline; filename=\"" + name 
      + "\""); 

      BufferedInputStream input = null; 
      BufferedOutputStream output = null; 
      time = System.currentTimeMillis(); 
      input = new BufferedInputStream(new ByteArrayInputStream(imageInByte)); 
      output = new BufferedOutputStream(response.getOutputStream()); 
      byte[] buffer = new byte[8192]; 
      int length; 

      while ((length = input.read(buffer)) > 0) { 
       output.write(buffer, 0, length); 
      } 

그러나 결과 이미지의 색상이 손실됩니다.

Before After

문제는 BYTEARRAY 변환 부분에있는 것 같아요. 이 문제를 어떻게 해결할 수 있습니까?

+0

이미지를 인코딩하기 전에 이미지를 디코딩해야합니까 (예 : 이미지에서 이미지 처리를 수행 할 계획입니까, 아니면 JPEG로 변환해야합니까?)? 그렇지 않다면 파일에서 서블릿 인'OutputStream'으로 바이트를 복사하는 것만으로 쉽게 피할 수 있습니다. 보너스로 훨씬 빨라졌습니다. – haraldK

답변

0

두 바이트 배열 변환이 있습니다. 하나는 파일을 읽는 동안 바이트 배열 버퍼로, 다른 하나는 http 응답 스트림에 쓰는 것입니다.

1) 어떤 파일인지 확인하기 위해 파일에 글을 쓸 수 있습니다. here을 볼 수 있듯이, 읽기 용 코드는 괜찮은 것 같습니다.

2) 출력 스트림의 경우에도 쓰고 플러시 하시겠습니까?

3) 콘텐츠 유형에 http 응답 헤더를 추가하여 브라우저에 도움을 받으실 수 있습니다.

+0

당신이 제안한대로 파일에 쓰려고했습니다. JPEG 버전은 아래에 게시 한 두 번째 파일 (손실 된 색상)과 동일하지만 PNG 및 GIF 버전이 좋습니다. 내 질문을 헤더로 업데이트했습니다. png로 jpeg를 변경해야합니까? 하지만 JPG 파일을 파일로도 JPG로 쓸 때 왜 JPG 파일의 색상이 손실됩니까? – ftb

+0

파일에 쓸 때도 색상이 인코딩되지 않으면 해당 단계에서 문제가 발생합니다. 아마도 'haraldK'가 제안한 바에 따라 파일에서 직접 바이트를 읽어 들여 변환하는 오버 헤드가 발생하지 않고 스트림으로 덤프 할 수 있습니다. –

관련 문제