我想获得每个像素的RGB代码。例如,我采用像素(0,0)(左角)。 我加载JPEG图像,然后存储在Java的Bitmap对象中。对于实验,我附上图像,例如:
我用PHP和Java学习RGB。代码如下:
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
主要问题是:
为什么使用相同的图像,上面两种方法会产生不同的结果?
答案 0 :(得分:2)
BMP与JPEG不同。
JPEG是一个压缩文件,而BMP是一个精确的未压缩文件(大多数)。当您在PHP中创建JPEG时,图像会被压缩并丢失一些信息,而这种差异很难被人眼注意到。在Java中,您使用不使用JPEG压缩的原始位图。因此,两个结果图像可能会有所不同,就像您已经注意到的那样。
答案 1 :(得分:2)
JPEG使用基于on the discrete cosine transform(DCT)的特定压缩。
此压缩将使用数学公式来根据像素区域减小信息的大小。这将导致浮动值需要在某个时刻进行舍入。当然,情况恰恰相反,要从JPEG重建位图,需要一些数学,基于如何实现这将导致差异,因为可能会以不同方式舍入某些值。
所以基本上,你有一个绘画(bmp文件),你想减少它的细节(信息的数量=文件的大小),为此,你可以用水稀释油漆,画仍然非常漂亮。但是一旦你做到了,你将看到的细节将取决于你想象他们的大脑。每个大脑(algorythm重新创建一个位图)都会看到一幅略有不同的画作。