2016-12-28 2 views
1

Ich möchte RGB-Code für jedes Pixel erhalten. Als Beispiel habe ich Pixel (0,0) genommen (Ecke links). Ich lade JPEG-Bild und dann in Bitmap-Objekt in Java speichern. Für Experiment anhängen ich das Bild zum Beispiel:Get RGB in Java und PHP haben unterschiedliche Ergebnisse

enter image description here

Ich nehme RGB mit PHP und Java. Hier ist der Code:

Java (rgbImage ist Bitmap-Objekt, das von JPEG-Datei geladen):

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/>"); 
      } 


     } 
    } 

Und das Ergebnis sowohl von ihnen sind:

JAVA: I/System.out: rot: 9 1,0 grün: 91,0 blau: 101,0

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

Die Hauptfrage ist:

Warum mit dem gleichen Bild zwei Verfahren können oben geben anderes Ergebnis?

+0

Da Sie ein JPEG haben, könnte etwas darüber sein, wie das API die Datei liest, dies ist keine Bitmap, also werden die Werte nicht für jedes Pixel geschrieben, sondern ausgewertet. Lies dies [post] (http://stackoverflow.com/questions/17893814/java-create-and-read-rgb-pixel-value-different?rq=1) über etwas Äquivalent – AxelH

+0

@axelh: ich vergesse es zu erzählen. Ich lade ein JPEG-Bild und speichere es im Bitmap-Objekt. – Michael

+0

@axelh: Du meinst die Qualität von JPEG bringt auf Unkomprimiert (Bitmap) zurück? – Michael

Antwort

2

Die JPEG verwenden eine spezifische Komprimierung basierend on the discrete cosine transform (DCT).

Bei dieser Komprimierung wird eine mathematische Formel verwendet, um die Größe der Informationen basierend auf der Pixelfläche zu reduzieren. Dies wird zu schwebenden Werten führen, die irgendwann gerundet werden müssen. Natürlich ist das Gegenteil der Fall, um eine Bitmap aus einem JPEG neu zu erstellen, einige Berechnungen sind erforderlich, basierend darauf, wie dies implementiert wird, führen zu Unterschieden, weil einige Werte möglicherweise anders gerundet werden.

Also im Grunde, Sie haben ein Gemälde (BMP-Datei), möchten Sie die Details davon reduzieren (Anzahl der Informationen = Größe der Datei), dafür können Sie Wasser verwenden, um die Farbe zu verdünnen, ist das Gemälde immer noch schön aus der Ferne. Aber sobald Sie das getan haben, hängen die Details, die Sie sehen werden, von Ihrem Gehirn ab, das sie sich vorstellen wird. Jedes Gehirn (Algorithmus, um eine Bitmap neu zu erstellen) wird ein leicht anderes Bild sehen.

2

BMP unterscheidet sich von JPEG.

JPEG ist eine komprimierte Datei, während BMP eine (vor allem) unkomprimierte Datei ist. Wenn Sie ein JPEG in PHP erstellen, wird das Bild komprimiert und verliert einige Informationen, und der Unterschied ist für ein menschliches Auge sehr schwer zu bemerken. In Java verwenden Sie eine ursprüngliche Bitmap, die keine JPEG-Komprimierung verwendet. Daher können zwei resultierende Bilder unterschiedlich sein, wie Sie bemerkt haben.

Lesen Sie here oder here auf Unterschiede zwischen diesen und anderen Formaten.

+0

Es tut mir leid, aber ich vergesse es Ihnen zu sagen: Ich lade JPEG-Bild von URL und speichern Sie dann in Bitmap-Objekt. Also die Qualität wie Bitmap oder trotzdem wie JPEG? – Michael

Verwandte Themen