No soy un hablante nativo de inglés, así que disculpe cualquier error de traducción.
Realmente no estoy teniendo un problema de codificación. Es más una cuestión conceptual.
Escribí dos veces el mismo código traduciendo una imagen en una lista de valores RGB. (1 combinación de 3 valores para cada píxel).
Primero escribí el código en VB.net usando:
Dim bmp As New Bitmap(File) For x As Integer = 0 To w - 1 For y As Integer = 0 To h - 1 Dim c As Color = bmp.GetPixel(x, y) Dim Red as integer = cR Dim Green as integer = cG Dim Blue as integer = cB Next y next xLuego escribí lo siguiente en Java:
BufferedImage image = ImageIO.read(new File(File)) for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { int pixel = image.getRGB(i,j); int Red = ((pixel >> 16) & 0xff); int Green = ((pixel >> 8) & 0xff); int Blue = ((pixel) & 0xff); } }Mi expectativa sería obtener los mismos valores de ambas piezas de código, ya que usan la misma imagen. Lo probé en una imagen (270x320) que era una fotografía (es decir, un espectro completo de colores). Para mi sorpresa, vi pequeñas diferencias en los valores RGB entre los códigos VB.net y Java.
Si comparo el java (rojo) con el VB.net (rojo), el java (verde) con el VB.net (verde) y el java (azul) con el VB. net(blue) comparo 270x320x3 = 259.2k combinaciones. Las diferencias entre los enteros obtenidos de VB.net y del código Java son las siguientes:
¿Alguien puede explicarme de dónde viene esta diferencia? ¿Tiene que ver con la forma de leer los colores, la forma de amortiguar la imagen o con algo como el suavizado?
Realmente curioso cuál es el motivo, gracias de antemano
Como mencionaron otros, la diferencia se debe a la compresión con pérdida de JPEG.
Debería probar estos métodos con un formato sin pérdidas.