【发布时间】: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,你就失去了精确的位图。就是这么简单。差异会很小,因此您始终可以在此处接受一些余量