2017-07-09 4 views
0

Ich habe eine JFrame-GUI, die Rohvideostream live von einer LAN-verbundenen Kamera aufnimmt. Ich setze den RBG-Wert (die Kamera streamt die Pixelwerte, aber auch nur die weißen und schwarzen Farben) für jede Koordinate in BufferedImage (img1) und zeichne das Bild auf einem standardmäßigen erweiterten Java-Canvas (MyCanvas canvas1).Warum wird die höhere Auflösung von BufferedImage in Canvas eingeschlossen und komprimiert?

Code-Snippet zum Zeichnen in Gewindeumgebung, die bis auf die Auflösung 1280x960 funktioniert.

while (true) { 
       synchronized (this) { 
        if (shouldrun == false) { 
         System.out.println("Quiting Thread.....\n"); 
         break; 
        } 
       } 
       if (in.read(ch) < 0) { 
        break; 
       } 
       /* Mono */ 
       pixelvalue = 0x00000000 | (ch[0] << 16) 
         | (ch[0] << 8) | (ch[0]); 
       img1.setRGB(x, y, pixelvalue); 
       x++; 
       //resWidth = 1280 
       if (x >= resWidth) { 
        x = 0; 
        y++; 
       } 
       framedata[pixelcount] = (byte) ch[0]; 
       pixelcount++; 
       //resHeight = 960 
       if (pixelcount >= resWidth * resHeight) { 
        System.out.println("pixelcount = " + pixelcount); 
        if (record == true) { 
         System.out.println("Recording Frame..."); 

         if (fo != null) { 
          fo.write(framedata); 
         } 
        } 
        synchronized (canvas1) { 
         canvas1.DrawImage(img1); 
         canvas1.repaint(); 
        } 
        Thread.sleep(33); 
        pixelcount = 0; 
        x = 0; 
        y = 0; 
       } 

      } 

-Code-Snippet Canvas-Klasse für canvas1 Objekt:

class MyCanvas extends Canvas { 
    int startAngle = 0; 
    int extent = 45; 
    boolean filled = false; 
    Image disimg = null; 

    public void DrawImage(Image img) { 
     disimg = img; 
    } 

    public void paint(Graphics g) { 
     g.setColor(Color.pink); 
     g.drawImage(disimg, 0, 0, null); 
    } 

    public void redraw(boolean filled, int start, int extent) { 
     this.filled = filled; 
     this.startAngle = start; 
     this.extent = extent; 
     repaint(); 
    } 

} 

Die Java-GUI-Anwendung erfolgreich in der Lage war, das Bild in 640x480 (resWidth = 640 & resHeight = 480) Auflösung Bild von der Kamera zu ziehen 640x480Image

Ich setze einfach die Variable resWidth auf 640 und die Variable resHeight auf 480 für Koordinateninkremente und die Canvas-Dimension.

jedoch, wenn dabei das gleiche für 1280x960 Auflösung das Ergebnis zeigt, 2 doppelte Bilder und komprimiert/zerquetscht vertikal: 1280x960Image

Warum sollte dies geschehen? Kann ich nicht einfach die Variablen Breite und Höhe im Code variieren? Könnte es das Jpanel-Layout sein? Oder wie die Kamera die Pixelwerte in dieser Auflösung streamt?

+0

Wir haben keine Kristallkugel in den Code zu suchen. Posten Sie hier eine [mcve], die das Problem reproduziert, so dass die Leute nachforschen können. –

+0

Sorry Code hinzugefügt, hoffe, dass das hilft, eine praktikable Lösung zu verstehen – Qwerty

Antwort

1

Wenn Sie Breite und Höhe sagen, ich nehme an, Sie nicht auf die Eingangsauflösung beziehen, die von der Kamera kommt, aber Sie wollen, zu ändern, wie es auf der Leinwand wiedergegeben wird. Die Eingabeauflösung kann nicht geändert werden und hängt vom Eingabegerät ab. Ich meine, Sie können die Eingangsauflösung nicht einfach auf 1920x1080 ändern, zum Beispiel weil die tatsächliche Auflösung von der Kamera selbst kommt, aber Sie können die Art, wie es gerendert wird, auf Ihr Display ändern (Ausgabeauflösung).

So von 640x480 Eingangsauflösung Kamera-Eingang, möchten Sie es auf eine 1280x960 Bildschirmauflösung rendern. Skalierung zweimal. Ich würde Ihren Code auf die ursprüngliche Breite und Höhe von 640x480 zurücksetzen und ich würde Ihre MyCanvas-Klassenerweiterung für das Rendern auf dem Bildschirm betrachten.

Der ursprüngliche Code

public void paint(Graphics g) { 
    g.setColor(Color.pink); 
    g.drawImage(disimg, 0, 0, null); 
} 

ich es

public void paint(Graphics g) { 
    g.setColor(Color.pink); 
    g.drawImage(disimg, 0, 0, desiredWidth, desiredHeight, null); 
} 

wo die desiredWidth und desiredHeight zu

können (640x480), da dies ändern würde oder (1280x960) oder alles, was Sie wünschen, ist, dass Sie etwas können Kontrolle, nicht die Eingabeauflösung.

Sie können sogar das Bild ziehen, um die gesamte Größe der Leinwand so etwas wie

public void paint(Graphics g) { 
    g.setColor(Color.pink); 
    g.drawImage(disimg, 0, 0, this.getWidth(), this.getHeight(), null); 
} 

Dies ist die API füllen Sie in der Suche würden. https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#drawImage(java.awt.Image,%20int,%20int,%20int,%20int,%20java.awt.image.ImageObserver)

Hoffe es hilft, Happy Coding!

+0

Danke, ja ich meinte es die Auflösung zu sein, um das Bild auf der Leinwand anzuzeigen. Eigentlich glaube ich, dass ursprüngliche Pixeldaten, die von der Kamera kommen, eine Auflösung von 1280 x 960 haben, so dass die Eingabeauflösung 1280 x 960 betragen würde. Ok ich werde versuchen, das Bild zu zeichnen, um die gesamte Größe der Leinwand zu füllen. – Qwerty

Verwandte Themen