Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 16 SDL
  gp 16.1 Was ist und kann SDL?
  gp 16.2 SDL installieren
  gp 16.3 SDL-Anwendungen erstellen
  gp 16.4 SDL initialisieren und Videomodus einstellen
    gp 16.4.1 Programmbeispiel – SDL initialisieren und Videomodus einstellen
  gp 16.5 Direkt auf den Bildschirm zeichnen
    gp 16.5.1 Programmbeispiel – direkt auf den Bildschirm zeichnen
  gp 16.6 Bitmap laden und anzeigen
    gp 16.6.1 Programmbeispiel – Bitmap laden und anzeigen
  gp 16.7 Ein anderes Grafikformat laden und anzeigen
  gp 16.8 Der rechteckige Bildbereich von SDL
  gp 16.9 Farbenschlüssel, Transparenz und Alpha-Blending
    gp 16.9.1 Alpha-Blending
  gp 16.10 Animation
    gp 16.10.1 Programmbeispiel – Animation
  gp 16.11 Eingabe- und Ereignisverarbeitung
    gp 16.11.1 SDL-Event-Struktur
    gp 16.11.2 Maus-Events
    gp 16.11.3 Programmbeispiel – Maus-Event
    gp 16.11.4 Tastatur-Events
    gp 16.11.5 Programmbeispiel – Tastatur-Events
    gp 16.11.6 Joystick-Events
    gp 16.11.7 Programmbeispiel – Joystick-Events
    gp 16.11.8 Weitere Events
  gp 16.12 Audio
    gp 16.12.1 Programmbeispiel – Audio
  gp 16.13 Ausblick


Rheinwerk Computing

16.6 Bitmap laden und anzeigen  downtop

Eine unkomprimierte Bitmap-Datei anzuzeigen ist in SDL keine Kunst. Hierfür werden lediglich zwei Funktionen benötigt. Zuerst müssen Sie die Funktion SDL_LoadBMP() zum Laden einer unkomprimierten Bitmap (Bilder mit der Extension *.bmp) verwenden.

SDL_Surface *SDL_LoadBMP(const char *file);

Als Parameter geben Sie die Datei (eventuell inklusive mit Pfad) an, die geladen werden soll. Zurück bekommen Sie anschließend einen Zeiger auf ein NEUES Surface, bei einem Fehler wird NULL zurückgegeben.

Anschließend müssen Sie das neu erhaltene Surface in das bereits vorhandene kopieren. Dies realisieren Sie mit der Funktion SDL_BlitSurface().

int SDL_BlitSurface( SDL_Surface *src,  SDL_Rect *srcrect,
                     SDL_Surface  *dst, SDL_Rect *dstrect );

Damit kopieren Sie den Bildausschnitt von Surface src in das Surface dst. Wird bei den Parametern srcrect und dstrect nicht NULL übergeben (was bedeutet, dass der komplette Bildausschnitt kopiert wird), können Sie je einen Zeiger auf eine Struktur vom Typ SDL_Rect übergeben. Damit können Sie die Größe des zu kopierenden Bildausschnitts von src nach dst angeben – also Bildausschnitte kopieren oder darstellen. Darauf wird noch eingegangen. Die Funktion wandelt, falls notwendig, außerdem auch andere, verschiedene Bildformate automatisch ineinander um. Es ist allerdings nicht möglich, den Bildausschnitt damit zu strecken oder zu stauchen! Bei Erfolg gibt diese Funktion 0, ansonsten bei Auftreten eines Fehlers –1 zurück.

Natürlich muss, um das Bild überhaupt anzeigen zu können, zuvor wieder die Funktion SDL_UpdateRect() aufgerufen werden – damit die Veränderungen auch auf dem Bildschirm gemacht werden.

Wenn Sie mit dem Surface fertig sind, sollten Sie die Ressourcen wieder freigeben. Dies können Sie mit einem Funktionsaufruf von SDL_FreeSurface() erledigen.

void SDL_FreeSurface(SDL_Surface *surface);

Rheinwerk Computing

16.6.1 Programmbeispiel – Bitmap laden und anzeigetoptop

Das folgende Beispiel stellt eine einfache Form einer Slideshow dar. Alle BMP-Dateien, die Sie in der Kommandozeile angegeben haben, werden für 1000 Millisekunden auf dem Bildschirm angezeigt. Es wurde außerdem bei der Funktion SDL_SetVideoMode() das Flag SDL_RESIZABLE verwendet, womit Sie den Videomodus im laufenden Betrieb verändern können. Das neue (Haupt-)Surface wird dann entsprechend der Bildgröße angepasst. Ansonsten werden alle Funktionen, die Sie bereits kennen gelernt haben, verwendet.

/* sdl3.c */
#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd. h.>
static void display_bmp( const char *datei, SDL_Surface *screen,
                         int x, int y) {
  SDL_Surface *bild;
  SDL_Rect ziel;
  /* lädt die BMP-Datei in ein Surface */
  bild = SDL_LoadBMP(datei);
  if ( bild == NULL ) {
    fprintf(stderr, "'%s' konnte nicht geladen werden: %s\n",
       datei, SDL_GetError());
    return;
  }
  /* auf den Bildschirm kopieren                     */
  /* die Surfaces sollten hier nicht gelockt sein.   */
  /* x,y = linke obere Ecke; w, h = Breite und Höhe  */
  ziel.x = x;
  ziel.y = y;
  ziel.w = bild->w;
  ziel.h = bild->h;
  /* Neue Größe des Surfaces entsprechend der Bildgröße */
  screen = SDL_SetVideoMode (bild->w, bild->h,
                             16, SDL_SWSURFACE | SDL_RESIZABLE);
  if (screen == NULL) {
    printf ("Videomodus konnte nicht verändert werden: %s\n",
       SDL_GetError ());
    exit(EXIT_FAILURE);
  }
  SDL_BlitSurface(bild, NULL, screen, &ziel);
  /* den veränderten Bildschirmbereich auffrischen */
  SDL_UpdateRect(screen, 0, 0, 0, 0);
  SDL_FreeSurface(bild);
}
int main (int argc, char **argv) {
  SDL_Surface *screen;
  int i;
  if( argc == 1 ) {
    printf("Bitte mindestens eine BMP-Datei angeben!\n");
    return EXIT_FAILURE;
  }
  /* SDLs Videosystem initialisieren und auf Fehler prüfen */
  if (SDL_Init (SDL_INIT_VIDEO) != 0) {
    printf ("Konnte SDL nicht initialisieren: %s\n",
       SDL_GetError ());
    return EXIT_FAILURE;
  }
  /* Wenn die Anwendung beendet wird,          */
  /* wird die Funktion SDL_Quit() ausgeführt   */
  atexit (SDL_Quit);
  /* Videomodus mit 640 x 480 Pixel, Hi-Color (16 Bit) */
  /* einrichten. Oberfläche (Surface) standardmäßig    */
  /* in den Hauptspeicher (SDL_SWSURFACE) legen       */
  screen = SDL_SetVideoMode (640, 480, 16,
                             SDL_SWSURFACE|SDL_RESIZABLE);
  if (screen == NULL) {
    printf ("Videomodus konnte nicht eingerichtet werden: "
            " %s\n", SDL_GetError ());
    return EXIT_FAILURE;
  }
  /* Slideshow starten ...                                   */
  /* Zeigt alle BMP-Bilddateien an, die in der Kommandozeile */
  /* mit angegeben wurden                                     */
  for( i = 1; argv[i] != NULL; i++) {
    display_bmp(argv[i], screen, 0, 0 );
    SDL_Delay (4000);  
  }
  printf ("Erfolgreich beendet!\n");
  return EXIT_SUCCESS;
}

Das Programm bei der Ausführung:

$ gcc `sdl-config --libs` `sdl-config --cflags` -o sdl3 sdl3.c
$ ./sdl3 john.bmp john2.bmp

Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 16.2    Laden und Anzeigen von BMP-Dateien


 << zurück
  
  Zum Katalog
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux-Server






 Linux-Server


Zum Katalog: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Katalog: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Katalog: Shell-Programmierung






 Shell-
 Programmierung


Zum Katalog: Linux Handbuch






 Linux Handbuch


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de