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

标签 java php colors rgb

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

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.out:红色:91.0 绿色:91.0 蓝色:101.0

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

主要问题是:

为什么同一张图片,上面两种方法给出的结果不同?

最佳答案

JPEG 使用基于特定的压缩 on the discrete cosine transform (离散余弦变换)。

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

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

关于java - 在 Java 和 PHP 中获取 RGB 有不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359065/

相关文章:

java - 非泛型类中的泛型实例变量

php - 重复数据库中的数据?

php - 在 phalcon 框架中的 xmlhttprequest 情况下如何禁用渲染布局?

php - 如何将 PHP 对象复制到不同的对象类型

html - 为什么 HSL 值不是人们所期望的?

iphone - 模糊 UILabel 作为 UITableViewCell contentView 的编程 subview

java - 添加方法到frame.add()

Java 正则表达式 - 恰好有一个空格的表达式

java - 在类或方法中声明字符串

colors - 为什么 CSS 过滤器hue-rotate 会产生奇怪的结果?