2017-04-20 1 views
1

Ich mache ein Programm, wo ich extrahiere Pixel-Array aus einem Bild, ARGB-Werte herausnehmen. Und schreibe sie wieder zurück, um ein anderes Bild zu machen.Bildqualität reduziert (wird rötlich) als JPEG mit BufferedImage

 BufferedImage imagebuffer = ImageIO.read(new File("C:\\Users\\Ramandeep\\Downloads\\w3.jpg")); 
     iw = imagebuffer.getWidth(); 
     ih = imagebuffer.getHeight(); 

     pixels = new int[iw * ih]; 
     PixelGrabber pg = new PixelGrabber(imagebuffer, 0, 0, iw, ih, pixels, 0, iw); 
     pg.grabPixels(); 

     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
     image.setRGB(0, 0, width, height, pixels, 0, width); 


     ImageIO.write(image, "jpg", new File("C:\\Users\\Ramandeep\\Desktop\\out.jpg")); 
     ImageIO.write(image, "gif", new File("C:\\Users\\Ramandeep\\Desktop\\out.gif")); 
     ImageIO.write(image, "png", new File("C:\\Users\\Ramandeep\\Desktop\\out.png")); 

Jetzt Ausgabe Bild für PNG und GIF gut aussehen, aber die Ausgabe jpg Bild stellt sich ziemlich rötlich.

Dies ist das Originalbild enter image description here Und das ist der Ausgang jpg Bild enter image description here

Jede Idee, was dieses verursachen könnte? Jeder Schub in die richtige Richtung wird geschätzt.

+0

Was ist die Bildverarbeitung Ihr Versuch sollte erreichen? – user7185318

+0

Nun, ich arbeite daran, eine einfache Textnachricht in das Bild unter Verwendung der LSB-Substitutionsmethode einzubetten. Aber vorher probiere ich einfach aus, die Pixel so zu schreiben, wie es in einem neuen Bild ist, um das aus dem Weg zu räumen. – Napstablook

+0

Warum nicht Graphics verwenden? – user7185318

Antwort

1

Ich weiß nicht, ob das für Sie funktioniert, aber ich habe es immer Pixel für Pixel getan. So :

BufferedImage imagebuffer = ImageIO.read(new File("C:\\Users\\Ramandeep\\Downloads\\w3.jpg")); 
iw = imagebuffer.getWidth(); 
ih = imagebuffer.getHeight(); 
BufferedImage image = new BufferedImage(iw,ih,BufferedImage.TYPE_INT_ARGB); 
for (int x=0; x < iw; x++) { 
    for (int y=0; y < ih; y++) { 
      image.setRGB(x,y,imagebuffer.getRGB(x,y)); 
    } 
} 
ImageIO.write(image, "jpg", new File("C:\\Users\\Ramandeep\\Desktop\\out.jpg")); 
ImageIO.write(image, "gif", new File("C:\\Users\\Ramandeep\\Desktop\\out.gif")); 
ImageIO.write(image, "png", new File("C:\\Users\\Ramandeep\\Desktop\\out.png")); 

Und auf diese Weise hat eine ähnliche Anzahl der Zeilen, so denke ich, es zu versuchen könnte.

Wenn Sie möchten, Text einfügen, id ìmport java.awt.*;, was Grafik und Graphics2D und Schriftart enthält, und dann:

Font font=new Font("Sans,0,20); //Name, type(none, bold, italic), size 
Graphics2D imagegraphics=imagebuffer.createGraphics(); 
imagegraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //enable antialiasing 
imagegraphics.setFont(font); 
imagegraphics.setColor(Color.BLACK); 
String yourtext="Fighter"; 
int h=imagegraphics.getFontMetrics().getHeight(); 
int w=imagegraphics.getFontMetrics().stringWidth(yourtext); 
imagegraphics.drawString(yourtext,5,h); //Draw text upper left corner, note that y-value is the bottom line of the string 

EDIT:

Es war der Alpha-Wert. Fixed by:

BufferedImage image = new 
BufferedImage(iw,ih,BufferedImage.TYPE_INT_RGB); //RGB, jpeg hasnt got alpha, ints have been converted as if they contain red first, but its alpha(the first bytes, these ints are interpreted bitwise i think) (argb), so it became more red. 
+0

Lassen Sie mich dies einen Wirbel geben und zurückkommen. – Napstablook

+0

Ah .. Leider das gleiche Ergebnis. jpg hat einen rötlichen Farbton. – Napstablook

+0

@Ramandeep: Bitte schauen Sie sich -my an, wie man "jpeg" anstelle von 'jpg' einfügt. – user7185318

Verwandte Themen