[Linux] einfaches Fenster zum darstellen eines unsinged char Bildes



  • Hallo c-community,

    ich suche gerade eine einfache Möglichkeit ein Fenster in Linux zu erzeugen. In diesem Fenster möchte ich einfach ein Bild im Format unsigned char darstellen. Ich hatte vor einer Weile mal QT versucht aber dieser schien sich mit meinen Threads zu stören, die Bilder aus einer Kamera lesen. Gut wäre es auch, wenn dieses Window gut nach Android portierbar wäre.

    MfG
    mirrowwinger



  • mirrowwinger schrieb:

    ein Bild im Format unsigned char darstellen.

    Was soll das bitte sein?



  • Also die Bilddaten, die ich mit dem v4l1/v4l2-treiber auslese sind im Variablen-Format unsigned char, was für mich daher Sinn macht, dass es das Raw-Bayer-Format 8bit ist. Da es keine negativen Werte hat -> unsigned und char aufgrund der Bit-Tiefe.



  • hab letztens die ergebnisse meines bildverarbeitungsprogramms mit wxWidgets angezeigt.
    ich denke, dass man das ganze auch einfacher lösen kann, aber es hat für meine zwecke gereicht (performance absolut ok auch bei großen bildern)

    void CWxFrame::OnPaint(wxPaintEvent &event)
    {
        wxPaintDC dc(this);
        PrepareDC(dc);
    
        const int colors = 3;
        const int offsetRed = 0;
        const int offsetGreen = 1;
        const int offsetBlue = 2;
        const wxPoint paintPos(200,0);
    
        Byte_t* data = 0;
    
        if(repaintNeeded)
        {
            repaintNeeded = false;
    
            data = reinterpret_cast<Byte_t*>(malloc(sizeof(Byte_t)*img->GetHeight()*img->GetWidth()*colors));
    
            for(uint32_t y = 0; y<img->GetHeight(); ++y)
            {
                for(uint32_t x=0; x<img->GetWidth(); ++x)
                {
                    Pixel& px = img->PixelAt(x,y);
                    const int idx = (y*img->GetWidth()+x)*colors;
    
                    if(!px.isGray)
                    {
                        data[idx+offsetRed]=px.red;
                        data[idx+offsetGreen]=px.green;
                        data[idx+offsetBlue]=px.blue;
                    }
                    else
                    {
                        data[idx+offsetRed]=px.gray;
                        data[idx+offsetGreen]=px.gray;
                        data[idx+offsetBlue]=px.gray;
                    }
                }
            }
    
            wxImg= wxImage(img->GetWidth(),img->GetHeight(), data);
            bmp=wxBitmap(wxImg);
        }
    
        dc.DrawBitmap(bmp,paintPos.x,paintPos.y,false);
    
    }
    

    Wobei img ein Objekt meiner eigenen Bildklasse ist.
    Mit repaintNeeded = true; Refresh(); zeichnest du das Bild neu.
    Und die Daten werden im DTOR vom wxImage gelöscht.



  • Ich benutze dafuer FLTK, das kann nur Fenster und nix anderes. Ein Vorteil ist, dass man nicht fuer jeden Scheiss von der Fensterklasse ableite muss.

    sind im Variablen-Format unsigned char

    Das verstehe ich nicht so ganz.

    wenn dieses Window gut nach Android portierbar

    Bezueglich FLTK habe ich keine Erfahrungen gemacht.



  • mirrowwinger schrieb:

    Gut wäre es auch, wenn dieses Window gut nach Android portierbar wäre.

    OpenGL ist dein Freund.



  • OpenGL schrieb:

    OpenGL ist dein Freund.

    Tja, man kann auch mit Kanonen auf Spatzen schiessen. Dennoch bleibts du schuldig, wie ein Fenster zu erzeugen ist.


Anmelden zum Antworten