SDL Farbenkonvertiertung



  • Hi,
    ich habe eine Surface mit einem Bild nun möchte ich das jede Stelle die den Wert (255,255,255) hat, (0,0,0) wird, wie bewerkstellige ich das mit SDL??

    mfg
    DKing



  • Willst du nur Weiß mit Schwarz ersetzten, oder willst du, dass der Bereich nicht gezeichnet wird?

    Wenn du willst, dass eine Farbei nicht gezeichnet wird, dann geht das mit SDL_SetColorKey.

    Wenn du eine Farbe mit einer anderen ersetzten willst, dann veränderst du die Daten, auf die pixels in deinem SDL_Surface zeigt. Mit SDL_GetRGB und SDL_MapRGB kannst du rausfinden, welche Werte du ersetzten musst.



  • Oh je, du scheinst Ahnung davon zu haben, kannst du mal nen ganz kleines Beispiel zeigen, wie man z.B. aus jedem R Wert R-20 z.b. macht. Also R verkleinert? Die Doku ist für mich an dieser Stelle kryptisch.



  • ungetestet:

    SDL_Surface* bild;
    Uint8 r, g, b;
    
    SDL_LockSurface (bild);
    for (int i = 0; i < bild->w * bild->h; i++) {
      // RGB Werte auslesen
      SDL_GetRGB (bild->pixels[i], bild->format, &r, &b, &g);
    
      // r auf 20 setzen
      r = 20;
    
      // Pixel speichern
      bild->pixels[i] = SDL_MapRGB(bild->format, r, g, b);
    }
    
    SDL_UnlockSurface (bild);
    


  • Hi,
    erstmal Danke für die Hilfe,
    leider kommt bei:

    bild->pixels[i]
    

    eine Fehlermeldung :(. Aber dank deinem Code weiß ich jetzt, wie es theoretisch funktioniert, das war mir vorher schleiherhaft :).
    Aber was ist an blobby1->pixels[i] falsch, nach der Doku würde ich das an dieser Stelle genau so tun.

    Debug Dialog:
    error C2036: 'void *' : unknown size
    error C2664: 'SDL_GetRGB' : cannot convert parameter 1 from 'void' to 'unsigned __int32'
    error C2036: 'void *' : unknown size
    error C2120: 'void' illegal with all types



  • müsse man nicht

    SDL_Surface* bild;
    Uint8 r, g, b;
    
    SDL_LockSurface (bild);
    for (int i = 0; i < bild->w * bild->h * image->format->BytesPerPixel ; i += image->format->BytesPerPixel) {
      // RGB Werte auslesen
      SDL_GetRGB (*(Uint32*)bild->pixels + i, bild->format, &r, &b, &g);
    
      // r auf 20 setzen
      r = 20;
    
      // Pixel speichern
      *((Uint32*)bild->pixels+i) = SDL_MapRGB(bild->format, r, g, b);
    }
    
    SDL_UnlockSurface (bild);
    


  • Dann kommt eine Popupfehlermeldung:
    First-chance exception in Blobby Volley 2.exe (SDL.DLL): 0xC0000005: Access Violation.

    Es liegt definitiv am Code 😕
    image habe ich gegen bild ausgetauscht, war falsch


Anmelden zum Antworten