【问题标题】:Get RGB in Java and PHP have different result在Java和PHP中获取RGB有不同的结果
【发布时间】:2017-05-12 13:27:19
【问题描述】:

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

我将 RGB 与 PHP 和 Java 结合使用。代码如下:

Java(rgbImage 是从 JPEG 文件加载的 Bitmap 对象):

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,可能与 API 如何读取文件有关,这不是位图,因此不会为每个像素写入值,而是进行评估。阅读此post 的相关内容
  • @axelh:我忘了说。我加载 JPEG 图像并存储在 Bitmap 对象中。
  • @axelh : 你的意思是 JPEG 的质量恢复到未压缩(位图)?
  • @axelh : 文件扩展名是JPEG,然后通过URL加载它,然后存储到Bitmap对象。所以资源是JPEG。
  • 一切都说了。您使用了 JPEG,因此您失去了精度,位图将基于 JPEG 格式构建(基本上取决于像素区域的变化)。所以一旦你有了 JPEG,你就失去了精确的位图。就是这么简单。差异会很小,因此您始终可以在此处接受一些余量

标签: java php colors rgb


【解决方案1】:

BMP 不同于 JPEG。

JPEG 是一种压缩文件,而 BMP 是一种精确的未压缩文件(大多数情况下)。当您在 PHP 中创建 JPEG 时,图像会被压缩并丢失一些信息,而人眼很难注意到差异。在 Java 中,您使用不使用 JPEG 压缩的原始位图。因此,两个生成的图像可能会有所不同,就像您注意到的那样。

阅读herehere,了解这些格式与其他格式之间的区别。

【讨论】:

  • 对不起,我忘了告诉你:我从 URL 加载 JPEG 图像,然后存储在位图对象中。那么画质像 Bitmap 还是像 JPEG 一样?
【解决方案2】:

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

此压缩将使用数学公式根据像素面积减少信息的大小。这将导致需要在某些时候四舍五入的浮动值。当然,反之亦然,要从 JPEG 重建位图,需要进行一些数学运算,根据实现方式会导致差异,因为可能会以不同的方式舍入一些值。

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

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多