2017-12-29 9 views
6

Ich konvertierte ein Bild in ein Array von Pixeln. Ich habe RGB-Werte in drei separaten Arrays gespeichert.Konvertieren Sie ein Bild in eine Pixelmatrix, erstellen Sie ein Bild mit Pixel - die Größe wird reduziert. Warum?

Dann habe ich versucht, das Bild mit den gleichen Werten (keine Manipulation) zu erstellen. Das Originalbild hatte eine Größe von 205kB und das neue Bild hatte 121kB im Falle eines Bildes B & W und von 215kB bis 96kB im Falle eines Farbbildes. Außerdem ändert sich die Helligkeit geringfügig (die Helligkeit wird erhöht und der Kontrast insgesamt). Was verursacht das?

Ich habe sowohl mit farbigen und B & W Bilder probiert. Das Ergebnis war das gleiche.

Auch lief ich den gleichen Code auf dem vorherigen Ausgabebild (96kB), die neue Ausgabe war immer noch 96kB.

Codes-


1) Bild lesen:

int width = img.getWidth(null); 
int height = img.getHeight(null); 

pixelR = new int[width * height]; 
pixelG = new int[width * height]; 
pixelB = new int[width * height]; 

int index=0; 

int r, g, b, gray, rgb; 

for(int i=0; i<width; i++) { 
    for (int j=0; j<height; j++) { 
    rgb = img.getRGB(i, j); 

    r = (rgb >> 16) & 0xFF; 
    g = (rgb >> 8) & 0xFF; 
    b = (rgb & 0xFF); 

    pixelR[index]=r; 
    pixelG[index]=g; 
    pixelB[index]=b; 
    index++; 
    } 
} 

2) Schreiben image:

 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

    int index=0; 
    int val; 
    int r, g, b; 

    for (int i=0; i<width; i++) { 
    for (int j=0; j<height; j++) { 

     r=pixelR[index]; 
     g=pixelG[index]; 
     b=pixelB[index++]; 

     Color newColor = new Color((int)r, (int)g, (int)b);  
     image.setRGB(i, j, newColor.getRGB()); 
    } 
    } 

    File f = null; 

    try{ 
    f = new File("<filepath>.jpg"); 
     ImageIO.write(image, "jpg", f); 
    }catch(IOException e){ 
     System.out.println("Error: "+e); 
    } 
    } 
+3

Vielleicht schreiben Sie mit einer niedrigeren Qualität als das Originalbild? –

+1

'PixelR [Index] = r; pixelG [index] = r; pixelB [index] = r; 'Sie weisen immer wieder denselben Wert zu. Ist es ein Tippfehler? – TDG

+0

@TDG ja, Tippfehler. Korrigiert. –

Antwort

1

Sie können versuchen, die Komprimierungsstufe auf verschiedene Werte einzustellen und zu sehen, wie die Dateigröße davon abhängt. Siehe Setting jpg compression level with ImageIO in Java für wie das geht.

Erklärt aber nicht die Veränderung von Helligkeit und Kontrast.

+0

Wäre das der Fall, würde das Ausgabebild nicht erneut komprimiert, wenn ich das Ausgabebild als Eingabebild zur Verfügung stelle? Sagen wir zum Beispiel ein Bild, ** image1 ** ist 100kB, wird auf 60kB komprimiert, wenn ich das Programm darauf ausführe und als ** output1 ** gespeichert werde, jetzt sollte das 60kB Bild wieder komprimiert werden, wenn ich das Programm starte es und speichern Sie es als ** output2 **, was nicht der Fall ist und ** output2 ** ist auch 60kB. –

+0

Nein, Sie können im Allgemeinen nicht mehrmals mit positiven Effekten komprimieren (Verringerung der Größe). Wenn das der Fall wäre, könnten Sie viele Male hintereinander komprimieren und eine Datei von nur einem Byte erstellen. Die resultierende Datei wäre nicht in der Lage, das Bild mit einer ähnlichen Qualität zu kodieren. Die Komprimierung beruht auf der Erkennung von Mustern in Daten und deren effizienter Codierung. Mit vielen gängigen Algorithmen können keine platzsparenden Muster erkannt werden, wenn die bereits komprimierten Daten ein zweites Mal ausgeführt werden. – sebkur

+0

Siehe diese Frage zu einer allgemeinen Diskussion über das mehrfache Komprimieren von Daten: https://stackoverflow.com/questions/3198666/why-can-data-be-compressed-only-once – sebkur

Verwandte Themen