2010-12-08 18 views
40

estoy usando el siguiente código para escribir un archivo JPG:Ρroblem usando ImageIO.write archivo jpg

String url="http://img01.taobaocdn.com/imgextra/i1/449400070/T2hbVwXj0XXXXXXXXX_!!449400070.jpg"; 
String to="D:/temp/result.jpg"; 
ImageIO.write(ImageIO.read(new URL(url)),"jpg", new File(to)); 

pero me da la result.jpg es una imagen de fondo de color rosa:

alt text

¿Cómo arreglar este problema? ¿Me puede dar algún código de ejemplo? (en la biblioteca J2SE)

+0

No es un duplicado sino un resultado similar con 'ImageIO.write()': http: // stackoverflow. com/questions/1830063/problem-converting-png-to-jpg-using-java-imageio-write –

+0

gracias, pero 'Página no encontrada', no puedo obtener la respuesta – Koerr

+0

¿Qué lector subyacente usas para leer jpeg? con el contenedor ImageIO? Podría ser con errores. – Jules

Respuesta

36

Puede solucionar esto utilizando Toolkit.createImage(url) en lugar de ImageIO.read(url) que utiliza una implementación diferente del algoritmo de descodificación.

Si está utilizando el codificador JPEG incluido con Sun JDK, también debe asegurarse de pasarle una imagen sin canal alfa.

Ejemplo:

private static final int[] RGB_MASKS = {0xFF0000, 0xFF00, 0xFF}; 
private static final ColorModel RGB_OPAQUE = 
    new DirectColorModel(32, RGB_MASKS[0], RGB_MASKS[1], RGB_MASKS[2]); 

    // ... 

String sUrl="http://img01.taobaocdn.com/imgextra/i1/449400070/T2hbVwXj0XXXXXXXXX_!!449400070.jpg"; 
URL url = new URL(sUrl); 
Image img = Toolkit.getDefaultToolkit().createImage(url); 

PixelGrabber pg = new PixelGrabber(img, 0, 0, -1, -1, true); 
pg.grabPixels(); 
int width = pg.getWidth(), height = pg.getHeight(); 

DataBuffer buffer = new DataBufferInt((int[]) pg.getPixels(), pg.getWidth() * pg.getHeight()); 
WritableRaster raster = Raster.createPackedRaster(buffer, width, height, width, RGB_MASKS, null); 
BufferedImage bi = new BufferedImage(RGB_OPAQUE, raster, false, null); 

String to = "D:/temp/result.jpg"; 
ImageIO.write(bi, "jpg", new File(to)); 

Nota: Mi conjetura es que el perfil de color está dañado, y Toolkit.createImage() ignora todos los perfiles de color. Si es así, esto reducirá la calidad de los archivos JPEG que tienen un perfil de color correcto.

+0

gracias, realmente funciona. –

17

Tuve problemas similares. Pero luego he resuelto mediante el uso de esta nota una

BufferedImage image = new BufferedImage(width, height, 
      BufferedImage.TYPE_INT_RGB); 

    //do something to populate the image 
    //such as 
    image.setRGB(x, y, pixelValue); //set your own pixels color 



    ImageIO.write(image, "jpg", new File("D:\\test.jpg")); 

que estoy usando la versión de Java 1.6.0_25-b06 y Es sólo funciona bien.

Tal vez pueda verificar la versión de Java.

+7

que funcionó totalmente! TYPE_INT_RGB es crucial aquí - esto elimina el tono rosado - ¡simplemente clone los píxeles de la imagen ARGB de origen a las imágenes RGB de salida y el tono rosado desaparece! – gibffe

+0

Respuesta muy similar a esta (aunque el ejemplo del código en este caso fue más fácil de seguir) http://stackoverflow.com/questions/1830063/problem-converting-png-to-jpg-using-java-imageio-write# answer-8418291 – RedYeti

1
BufferedImage originalImage = ImageIO.read(getContent()); 
BufferedImage newImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_3BYTE_BGR); 

    for (int x = 0; x < originalImage.getWidth(); x++) { 
     for (int y = 0; y < originalImage.getHeight(); y++) { 
      newImage.setRGB(x, y, originalImage.getRGB(x, y)); 
     } 
    } 

este hizo el truco para mí

+0

intenté esto pero no funcionó para mí –

8

Esto funciona para mí:

int w = originalImage.getWidth(); 
int h = originalImage.getHeight(); 
BufferedImage newImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
int[] rgb = originalImage.getRGB(0, 0, w, h, null, 0, w); 
newImage.setRGB(0, 0, w, h, rgb, 0, w); 
1

que enfrentan el mismo problema al leer y escribir imágenes usando ImageIO. Después de leer las respuestas aquí, cambié mi JRE - de openjdk version "1.8.0_91" a HotSpot java version "1.8.0_102". La sugerencia no era obvia en la respuesta de finnw, pero vale la pena intentarlo ;-)

¡Y así se resolvió el problema! Entonces, si está utilizando OpenJDK JRE y tiene libertad para cambiar su JRE, cambiarlo de HotSpot y no necesitará cambiar su código.

0
  • para mí el problema no fue la lectura pero la escritura
  • ImageIO estará feliz de escribir archivos JPG de ARGB BufferedImages
  • Navegadores/otros programas luego interpretar este archivo de 4 canales como color CMYK o algo, lo que resulta en el efecto descrito en esta pregunta
  • solución para mí: asegúrese de que esa Imagen Buffered que se pasa a ImageIO.escribir es del tipo RGB (no ARGB)
  • esto también explica por qué el problema solo aparece al guardar en jpeg, pero no al guardarlo en png
  • esto me tomó mucho tiempo para averiguarlo porque mis propias herramientas de imagen siempre convertir a ARGB sobre la marcha, por lo que siempre estaba pasando una imagen ARGB a ImageIO.write, sin darme cuenta