2012-10-18 7 views
3

이미지를 읽는 데 문제가 있습니다. 다음을 수행하면빨간 마스크로 생성 된 자바 버퍼 이미지

URL url = new URL("http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg"); 
ImageInputStream stream = ImageIO.createImageInputStream(url.openStream()); 
ImageReader reader = ImageIO.getImageReaders(stream).next(); 
reader.setInput(stream, true, true); 
BufferedImage image = reader.read(0); 

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next(); 
ImageOutputStream ios = ImageIO.createImageOutputStream(bos); 
writer.setOutput(ios); 
IIOImage ioImage = new IIOImage(image, null, null); 
writer.write(ioImage); 
ios.close(); 
FileOutputStream fos = new FileOutputStream("badimage.jpeg"); 
fos.write(bos.toByteArray()); 
fos.close(); 

이미지가 붉은 색으로 표시됩니다. 이 이미지를 올바르게 읽으려면 설정해야 할 옵션이 있습니까?

+2

([ImageIO에서 자바에 이상한 색깔의 JPEG 파일]에서보세요 http://blog.idrsolutions.com/2009/04 : 여기 – MadProgrammer

답변

5

문제는 일부 JPG 이미지를 올바르게 읽지 못하는 ImageIO.read과 관련된 것일 수 있습니다. 아직 부분적으로 해결되지 않은 비슷한 bug (버그 ID : 4881314)이 있습니다.

대안으로 지정된 이미지를 올바르게 처리하는 것으로 보이는 Toolkit.createImage을 사용해 볼 수 있습니다. 예를 들면 다음과 같습니다

import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

class TestImage { 
    public static void main(String args[]) { 
     try { 
      URL imageUrl = new URL(
       "http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg"); 
      BufferedImage ioImage = ImageIO.read(imageUrl); 
      Image toolkitImage = Toolkit.getDefaultToolkit().createImage(
        imageUrl); 

      JPanel panel = new JPanel(); 
      panel.add(new JLabel(new ImageIcon(ioImage))); 
      panel.add(new JLabel(new ImageIcon(toolkitImage))); 

      JOptionPane.showMessageDialog(null, panel, "ImageIO vs Toolkit", 
        JOptionPane.INFORMATION_MESSAGE); 

     } catch (Exception e) { 
      JOptionPane.showMessageDialog(null, e.getMessage(), "Failure", 
        JOptionPane.ERROR_MESSAGE); 
      e.printStackTrace(); 
     } 
    } 
} 

은 결과입니다

enter image description here

0
BufferedImage bi = 
    ImageIO.read(
     "http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg"); 
ImageIO.write(bi, 'JPEG', new File("badimage.jpeg"); 
1

죄송합니다. 빨간 색조가있는 이유에 대한 답이 없습니다.

이것은 우리 소프트웨어에서 이미지를 읽는 방법입니다. 여기서는 스칼라 라이브러리를 사용하여 이미지의 크기를 조정합니다.

URL url = new URL("http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg"); 
BufferedImage source = javax.imageio.ImageIO.read(url); 
BufferedImage manipulated = ... 
FileOutputStream fos = new FileOutputStream("badimage.jpeg"); 
javax.imageio.ImageIO.write(manipulated , "png", fos); 
0
ImageIcon mySourceImage = new ImageIcon(sourceImageFile.getAbsolutePath()); 
BufferedImage sourceImage = new BufferedImage(mySourceImage.getIconWidth(), mySourceImage.getIconHeight(), BufferedImage.TYPE_3BYTE_BGR); 
Graphics2D g2d2 = (Graphics2D) sourceImage.getGraphics(); 
mySourceImage.paintIcon(null, g2d2, 0, 0); 
g2d2.dispose(); 

위의 코드는 (아주 아마도) 버그를 포함 Image.read를 사용하지 않습니다. 빨간색 이미지를 생성하지 않습니다. 하지만 BufferedImage 세 번째 매개 변수의 colorspace에 대해서는 잘 모르겠습니다.

0

다른 답변에서 언급했듯이 ImageIO와 Oracle JRE에 번들로 제공되는 표준 JPEG 플러그인의 알려진 버그입니다.

그러나 JPEG 플러그인을 TwelveMonkeys ImageIO JPEG plugin으로 바꾸면 OP의 원래 코드 에서처럼 ImageIO를 계속 사용할 수 있습니다. JAR 및 그 종속성을 런타임 클래스 경로에 추가하기 만하면됩니다. 코드 변경 필요 없음 (OP의 테스트 파일로 테스트).

플러그인은 특히 표준 JPEG 플러그인으로 많은 문제를 해결하거나 해결하도록 만들어졌습니다. 그것은 CMYK JPEG, 깨진 ICC 프로파일, Exif 데이터 등을 지원합니다. 이 플러그인은 저에 의해 개발되었으며, 오픈 소스 BSD 라이센스하에 자유롭게 배포 될 수 있습니다.

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    //TestImage 
    String testImage = "UNC Path or URL.jpg";//Load your image here... 

    //Get the streams 
    FileInputStream inStream = new FileInputStream(testImage); 
    ServletOutputStream outStream = response.getOutputStream(); 

    //Create the buffers 
    BufferedInputStream inBuf = new BufferedInputStream(inStream); 
    BufferedOutputStream outBuf = new BufferedOutputStream(outStream); 

    //Write input into output 
    int ch =0; ; 
    while((ch=inBuf.read())!=-1) 
     outBuf.write(ch); 

    inBuf.close(); 
    inStream.close(); 
    outBuf.close(); 
    outStream.close(); 
} 
0

는 ImageIO에서를 사용하여 whitout 임시 해결책에 대한 자바 서블릿 예입니다/홀수 컬러 jpegs-in-java-with-imageio /). 몇 번이나이 문제에 대해 들었지만 문제는 없었습니다. PNG를 사용합니다.