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.
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 –
gracias, pero 'Página no encontrada', no puedo obtener la respuesta – Koerr
¿Qué lector subyacente usas para leer jpeg? con el contenedor ImageIO? Podría ser con errores. – Jules