Я хочу получить код RGB для каждого пикселя. В качестве примера я взял пиксель (0,0) (угол слева). Я загружаю изображение JPEG и затем сохраняю в растровом объекте в Java. Для эксперимента я прикрепляю изображение, например:
Я беру RGB с PHP и Java. Вот код:
Java (rgbImage — это растровый объект, загруженный из файла JPEG):
int width = rgbImage.getWidth();
int height = rgbImage.getHeight();
for (int x = 0; x < rgbImage.getWidth(); x++){
for (int y = 0; y < rgbImage.getHeight(); y++) {
int pixel = rgbImage.getPixel(x, y);
double red = Color.red(pixel);
double green = Color.green(pixel);
double blue = Color.blue(pixel);
if(x == 0 && y == 0){
System.out.println("red : "+red+" green : "+green+" blue : "+blue);
}
PHP:
$rgbImage = imagecreatefromjpeg("$path");
$width = imagesx($rgbImage);
$height = imagesy($rgbImage);
for($x = 0 ; $x < $width ; $x++){
for($y = 0 ; $y < $height ; $y++){
$rgb = imagecolorat($rgbImage, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
if($x == 0 && $y == 0){
echo("r : $r , g : $g, b : $b <br/>");
}}
}
И результат они оба:
JAVA: I / System.out: красный: 91,0, зеленый: 91,0, синий: 101,0
PHP: r: 93, g: 91, b: 102
Главный вопрос:
Почему с одним и тем же изображением два метода выше могут дать разный результат?
JPEG использует специфическое сжатие на основе на дискретном косинусном преобразовании (ДКП).
Это сжатие будет использовать математическую формулу для уменьшения размера информации в зависимости от площади пикселя. Это приведет к плавающим значениям, которые необходимо будет округлить в некоторой точке. Конечно, верно обратное: для восстановления растрового изображения из JPEG требуется некоторая математика, основанная на том, как это будет реализовано, приведет к различиям, потому что некоторые значения могут округляться по-разному.
Итак, в основном, у вас есть картина (файл bmp), вы хотите уменьшить ее детализацию (количество информации = размер файла), для этого вы можете использовать воду, чтобы разбавить краску, картина все еще хороша из расстояние. Но как только вы это сделаете, детали, которые вы увидите, будут зависеть от вашего мозга, который их представит. Каждый мозг (алгоритм воссоздания растрового изображения) будет видеть немного различную картину.
BMP отличается от JPEG.
JPEG является сжатым файлом, в то время как BMP является точным несжатым (в основном). Когда вы создаете JPEG в PHP, изображение сжимается и теряет некоторую информацию, а человеческое зрение очень трудно заметить. В Java вы используете оригинальный Bitmap, который не использует сжатие JPEG. Поэтому два получающихся изображения могут отличаться, как вы заметили.
Читать Вот или же Вот на различия между этими и другими форматами.