2017-05-25 3 views
1

Also habe ich versucht, nach der Lösung zu suchen, aber konnte keine Lösung finden, wo ich das RGBA zu RGB Format umwandeln kann.Wie konvertiert man BufferedImage RGBA in BufferedImage RGB?

Wenn eine einfache Lösung von BufferedImage Umwandlung in BufferedImage ist dann gegeben, das am besten sein wird, sonst ist das Problem wie folgt:

Grundsätzlich muss ich BufferedImage in MAT-Format konvertieren. Es funktioniert ordnungsgemäß für JPG/JPEG-Bilder, aber nicht PNGs. Der folgende Code, den ich für die Konvertierung verwende:

BufferedImage biImg = ImageIO.read(new File(imgSource)); 
      mat = new Mat(biImg.getHeight(), biImg.getWidth(),CvType.CV_8UC3); 
      Imgproc.cvtColor(mat,matBGR, Imgproc.COLOR_RGBA2BGR); 
      byte[] data = ((DataBufferByte) biImg.getRaster().getDataBuffer()).getData(); 
      matBGR.put(0, 0, data); 

Dies löst Fehler für Bilder mit RGBA-Werten. Also auf der Suche nach einer Lösung.

Vielen Dank im Voraus.

+0

"Dies löst Fehler für Bilder mit RGBA-Werten." Ist der Fehler ein Geheimnis? | Können Sie diesen Code etwas näher erläutern? In Zeile 2 erstellen Sie eine 3-Kanal-Matte mit der gleichen Größe wie 'biImg' und setzen keine Daten. Als nächstes konvertieren Sie diese leere Matte von 4-Kanal (RGBA) zu 3-Kanal (BGR). Da der Eingang 3 Kanal ist, nehme ich an, deshalb beschwert er sich. | Als nächstes kopieren Sie die Daten von 'biImg' in die resultierende' Mat' ... waren das nicht überhaupt Daten in RGBA? | Dieser Code ist mächtig verwirrend ... –

Antwort

2

fand ich eine Lösung wie folgt aus:

BufferedImage oldRGBA= null; 
    try { 
     oldRGBA= ImageIO.read(new URL("http://yusufcakmak.com/wp-content/uploads/2015/01/java_ee.png")); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    final int width = 1200; 
    final int height = 800; 
    BufferedImage newRGB = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
    newRGB .createGraphics().drawImage(oldRGBA, 0, 0, width, height, null); 
    try { 
     ImageIO.write(newRGB , "PNG", new File("your path")); 

    } catch (IOException e) {} 

hier also, wenn wir neue BufferedImage schaffen wir können mit dem Typ des Bildes ändern:

enter image description here

Die RGB arbeitete für mich mit PNG .

0
public static BufferedImage toBufferedImageOfType(BufferedImage original, int type) { 
     if (original == null) { 
      throw new IllegalArgumentException("original == null"); 
     } 
     if (original.getType() == type) { 
      return original; 
     } 
     BufferedImage image = new BufferedImage(original.getWidth(), original.getHeight(), type); 
     Graphics2D g = image.createGraphics(); 
     try { 
      g.setComposite(AlphaComposite.Src); 
      g.drawImage(original, 0, 0, null); 
     } 
     finally { 
      g.dispose(); 
     } 
     return image; 
    }