gaanz einfach pixel machen



  • Hallo Forum!
    Also ich komm aus der basic ecke und habe vor eines meiner Programme aus Geschwindigkeitsgründen in C neu zu schreiben.Ich suche daher nach einem Compiler bzw Suite(halt alles in einem -ihr wisst glaub ich was ich meine)
    Jedoch wäre es schön da schon Grafikroutinen drinzuhaben.
    Das Ding ist das ich keine Zeit habe mich mit DirectDraw(?) oder GDL zu beschäftigen. ich will einfach einen Befehl zum Grafikmodus setzen und einen zum Pixel setzen(schnell!!). Habt ihr da vorschläge?
    Danke!



  • Unter Windows nimmste Dir Visual Studio Express und 'ne geeignete Lib, zb SDL oder Pixeltoaster oder TinyPTC...



  • Eine Möglichkeit besteht in der Verwendung der Bibliothek „C++ Template Image Processing Library“.
    Die Bibliothek kann von dieser Webseite aus heruntergeladen werden: http://cimg.sourceforge.net/.
    Eine minimal Anwendung kann dabei so aussehen:

    #include "CImg-1.2.2.1\CImg.h"
    #include <iostream>
    using namespace cimg_library;
    
    // Setzt ein bestimmtes Pixel in einer Rastergrafik.
    template <class T>
    void draw_pixel(CImg<T>& img, int x, int y, T red = 255, T green = 0, T blue = 0)
    {
    	if(x < 0 ||
    		y < 0 ||
    		img.height < y ||
    		img.width < x)
    		return;
    
    	unsigned char color[3]={red,green,blue};    // Define a purple color
    	y = img.height-y-1;
    	img.draw_line(x,y,x,y,color);
    
    }
    
    int main() {
    	CImg<unsigned char> img(640,400,1,3);    // Define a 640x400 color image with 8 bits per color component.
    
    	draw_pixel(img, 100, 100);
    
    	img.save_png("test.png"); // Save the image as a png file.
    	img.display("Test");  // Display the image in a display window.
    	return 0;
    }
    

    Die Bibliothek ist für verschiedene Plattformen verfügbar. Wer unter Windows arbeitet kann auch GDI benutzen. In dem Artikel „WinAPI & C++: Wie male ich ein Pixel?“ habe ich diese Möglichkeit beschrieben: http://loop.servehttp.com/~vertexwahn/oldwiki/public_html_an_turing/DrawPixel.pdf

    Eine Ebenfalls Plattformunabhängige Möglichkeit bietet PixelToaster. Die Bibliothek ist auf der Seite http://www.pixeltoaster.com/ verfügbar. Auch hier möchte ich eine kleine Beispielanwendung zeigen:

    #include "PixelToaster.h"
    
    using namespace PixelToaster;
    
    int main()
    {
        const int width = 320;
        const int height = 240;
    
    	Display display( "TrueColor Example", width, height, Output::Default, Mode::TrueColor );
    
    	vector<TrueColorPixel> pixels( width * height );
    
        while ( display.open() )
        {
            unsigned int index = 0;
    
            for ( int y = 0; y < height; ++y )
            {
                for ( int x = 0; x < width; ++x )
                {
    				pixels[index].r = (integer8) ( x < 255 ? x : 255 );
    				pixels[index].g = (integer8) ( y < 255 ? y : 255 );
    				pixels[index].b = (integer8) ( x+y < 255 ? x+y : 255 );
    
    				++index;
                }
            }
    
    		display.update( pixels );
        }
    }
    


  • Danke für die ausführliche Antwort! Werd mir das mal ansehen.Zwei Fragen hätte ich da noch: Welche der aufgefühten Methoden wäre die schnellste? Welchen Compiler könnt ihr empfehlen?



  • Welche der aufgefühten Methoden wäre die schnellste ?

    Im Sinne von "Ausfuehrungsgeschwindigkeit" oder "Implementierungsdauer" ?



  • naja im Sinne von Ausführungsgeschwindigkeit. Auf der anderen Seite will ich das natürlich auch nicht auf Assembler schreiben wenn du verstehst..



  • Einzelne Pixel zu setzen widerspricht Deiner Anforderung von Geschwindigkeit.
    Bei praktisch allen genannten Konzepten wird zunaechst eine "Bitmap" im Hauptspeicher erzeugt und manipuliert. Zur Anzeige muss dieser Speicher zur Grafikkarte uebertragen/konvertiert werden, was bei grossen Aufloesungen nunmal wenig performant ist.
    Je nachdem was genau Du erreichen willst, waeren vielleicht andere Vorgehensweisen sinnvoller.



  • @Perplex:
    Wenn du mit der CPU Pixel setzen willst wäre eine Library die Bitmaps im Speicher im 32 Bit BGRX Format liegen hat (bzw. dies unterstützt) ideal.
    Mit SDL sollte das AFAIK gehen.

    Dann kannst du die Bitmap einfach als DWORD Array ansprechen, viel schneller gehts nicht.

    Mit DirectDraw ist das recht schnell gemacht, wenn du allerdings noch nie etwas mit DirectDraw gemacht hast ... ist vermutlich wirklich eine andere Library ala SDL besser.



  • ich habe jetzt mal das Pixeltoaster CodeBeispiel ausprobiert. bzw ich habs probiert.Wie ich am anfang geschrieben habe komm ich halt aus der Basic Ecke -deswegen hab ich von keine Ahnung von C(wir hatten das 1 Sem. an der FH) Mit dem Code selber komm ich soweit gut klar aber ich hab keine Ahnung was es mit Linker und Bibliotheken etc. auf sich hat. ich hab den dev-c++ compiler runtergeladen- neues project geöffnet und dann einfach das codeschnipsel eingetzt. dann kommt diese fehlermeldung: [Linker error] undefined reference to `PixelToaster::createDisplay()'
    ld returned 1 exit status
    D:\Programme\Dev-Cpp\Makefile.win [Build Error] [Projekt2.exe] Error 1
    kann mir jemand idiotensicher (step by step) erklären wie ich das programm zum laufen kriege? danach komm ich klar... übrigens ziemlich schnelles und nettes Forum hier



  • Nicht für Dev-C++.

    Ich würde dir überhaupt empfehlen nicht Dev-C++ sondern Visual C++ 2005 oder 2008 Express zu verwenden. Die Express Versionen sind gartis, und Visual C++ so ziemlich *der* Standard-Compiler für Windows.

    Der Grund sollte klar sein: der Linker findet die Funktionen aus der PixelToaster Library nicht, da du sie nicht mit linkst ("bindest").
    Dazu gibt es in der IDE (in deinem Fall jetzt Dev-C++) irgendwo eine Option in den Projekteinstellungen, wo du Libraries angeben kannst die mit zu linken sind. Ob Dev-C++ mit Libraries im MSVC (Microsoft Visual C) Format zurechtkommt, oder ob bei PixelToaster LIBs im GCC Format mitkommen weiss ich nicht. Könnte aber leicht sein dass beides nicht der Fall ist, und dann müsstest du die PixelToaster Library neu compilieren.



  • ok hab jetzt Visual C++ 2008 Express installiert. Dann wollte ich die Pixeltoasterbeispielprogramme ausführen ->d3dx9.h fehlt .also lad ich mir jetzt die DX SDK märz 2008 runter. Muss ich sonst nochwas runterladen? Wie linke(?) ich das dann?



  • pixeltoaster compilen (siehe readme), die entstandene lib an einem standort deiner wahl ablegen und in den eigenschaften deines projektes (unter linker) den pfad und namen dieser lib eintragen.



  • ok readme lesen bringt vorteile.. hier steht ich brauch noch Platform SDK mhh werd ich wohl mal noch downloaden. Hier steht auch wenn ich Pixeltoaster mit MinGW benutze brauch ich die Direct x SDK nicht.. brauch ich dann trotzdem die Platform SDK?



  • Unter Windows wäre die mit Abstand simpelste Methode, einfach ein Array mit Farbwerten mit SetDIBitsToDevice() auf den Bildschirm zu bringen.



  • Hier steht auch wenn ich Pixeltoaster mit MinGW benutze brauch ich die Direct x SDK nicht..

    du solltest dich fuer einen compiler entscheiden.

    hier steht ich brauch noch Platform SDK [...]
    brauch ich dann trotzdem die Platform SDK?

    wenn das da steht wird das schon stimmen.



  • ok ich hab mich jetzt entschieden. und zwar werde ich das wie anfänglich geplant mit devc++ machen. leider bekomme ich das immer noch nicht hin. wäre echt cool wenn mir jemand step by step erklären könnnte wie ich die beispielprogramme von Pixeltoaster zum laufen bringe.



  • Perplex schrieb:

    ok ich hab mich jetzt entschieden. und zwar werde ich das wie anfänglich geplant mit devc++ machen. leider bekomme ich das immer noch nicht hin. wäre echt cool wenn mir jemand step by step erklären könnnte wie ich die beispielprogramme von Pixeltoaster zum laufen bringe.

    ok, sorry wenn ich mich jetzt auch noch einmisch und dir nochmal was anderes sag, aber: Dev-C++ ist veraltert, verbuggt und wird nicht weiterentwickelt. Fuer MinGW ist die bei weitem beste IDE Code::Blocks ( www.codeblocks.org ).

    die Step by Step - Anleitung sollte eigentlich im Readme stehen.


Anmelden zum Antworten