有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java和PHP中获取RGB有不同的结果

我想得到每个像素的RGB代码。以像素(0,0)(左角)为例我加载JPEG图像,然后将其存储在Java中的位图对象中。对于实验,我附上图像,例如:

enter image description here

我用PHP和Java学习RGB。下面是代码:

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。输出:红色:91.0绿色:91.0蓝色:101.0

PHP:r:93,g:91,b:102

主要问题是:

为什么对于相同的图像,上述两种方法可以给出不同的结果


共 (2) 个答案

  1. # 1 楼答案

    BMP与JPEG不同

    JPEG是一个压缩文件,而BMP是一个精确的未压缩文件(大部分)。在PHP中创建JPEG时,图像会被压缩并丢失一些信息,人眼很难注意到其中的差异。在Java中,使用原始位图,而不使用JPEG压缩。因此,正如您所注意到的,两个结果图像可能不同

    阅读herehere这些格式与其他格式之间的差异

  2. # 2 楼答案

    JPEG使用特定的基于压缩的on the discrete cosine transform(DCT)

    这种压缩将使用一个数学公式,根据像素面积缩小信息的大小。这将导致需要在某个点进行四舍五入的浮点值。当然,情况正好相反,要从JPEG重建位图,需要进行一些数学运算,这取决于如何实现,这将导致差异,因为可能会对某些值进行不同的舍入

    所以基本上,你有一幅画(bmp文件),你想减少它的细节(信息数量=文件大小),因此,你可以用水稀释颜料,从远处看,这幅画仍然很漂亮。但一旦你做到了这一点,你将看到的细节将取决于你的大脑对它们的想象。每个大脑(重建位图的算法)都会看到稍微不同的画面