2013-09-04 3 views
1

Я пытаюсь манипулировать пикселем, используя sdl и умею читать их сейчас. Ниже приведен пример кода. Когда я печатаю I это printf("\npixelvalue is is : %d",MyPixel); я получаю значение, как этогоПиксельная манипуляция с использованием sdl

11275780 
11275776 
etc 

Я знаю, они не нахожусь в шестнадцатеричной форме, но, как манипулировать, я хочу, чтобы отфильтровать только синие цвета из? Во-вторых, после манипуляции с созданием нового изображения?

#include "SDL.h" 

int main(int argc, char* argv[]) 
{ 
    SDL_Surface *screen, *image; 
    SDL_Event event; 
    Uint8 *keys; 
    int done = 0; 

    if (SDL_Init(SDL_INIT_VIDEO) == -1) 
    { 
    printf("Can't init SDL: %s\n", SDL_GetError()); 
    exit(1); 
    } 
    atexit(SDL_Quit); 
    SDL_WM_SetCaption("sample1", "app.ico"); 

    /* obtain the SDL surfance of the video card */ 
    screen = SDL_SetVideoMode(640, 480, 24, SDL_HWSURFACE); 
    if (screen == NULL) 
    { 
    printf("Can't set video mode: %s\n", SDL_GetError()); 
    exit(1); 
    } 
    printf("Loading here"); 

    /* load BMP file */ 
    image = SDL_LoadBMP("testa.bmp"); 
    Uint32* pixels = (Uint32*)image->pixels; 
    int width = image->w; 
    int height = image->h; 
    printf("Widts is : %d",image->w); 

    for(int iH = 1; iH<=height; iH++) 
    for(int iW = 1; iW<=width; iW++) 
    { 
     printf("\nIh is : %d",iH); 
     printf("\nIw is : %d",iW); 
     Uint32* MyPixel = pixels + ((iH-1) + image->w) + iW; 
     printf("\npixelvalue is is : %d",MyPixel); 
    } 

    if (image == NULL) { 
    printf("Can't load image of tux: %s\n", SDL_GetError()); 
    exit(1); 
    } 

    /* Blit image to the video surface */ 
    SDL_BlitSurface(image, NULL, screen, NULL); 
    SDL_UpdateRect(screen, 0, 0, screen->w, screen->h); 

    /* free the image if it is no longer needed */ 
    SDL_FreeSurface(image); 

    /* process the keyboard event */ 
    while (!done) 
    { 
    // Poll input queue, run keyboard loop 
    while (SDL_PollEvent(&event)) 
    { 
     if (event.type == SDL_QUIT) 
     { 
     done = 1; 
     break; 
     } 
    } 
    keys = SDL_GetKeyState(NULL); 
    if (keys[SDLK_q]) 
    { 
     done = 1; 
    } 
    // Release CPU for others 
    SDL_Delay(100); 
    } 
    // Release memeory and Quit SDL 
    SDL_FreeSurface(screen); 
    SDL_Quit(); 
    return 0;  
} 
+1

Без отступов, это довольно трудно прочитать код ... – Appleshell

+0

@AdamS это лучше сейчас. – user2711681

+1

% x вместо% d даст вам шестнадцатеричное значение. Обычно цвета состоят из красного, зеленого, синего. значения. Может быть, один байт в вашем Int32 для каждого. Возможно, дополнительный альфа-компонент. –

ответ

0

Если я правильно помню, я использовал sdl_gfx для манипулирования пикселей.

Он также содержит функцию, как рисовать круг, овал и т.д.

2

Использование SDL_MapRGB и SDL_MapRGBA сортировать цвета вне. SDL отфильтрует его для вас на основе формата поверхности.

Так же, как это:

Uint32 rawpixel = getpixel(surface, x, y); 
Uint8 red, green, blue; 

SDL_GetRGB(rawpixel, surface->format, &red, &green, &blue); 
+0

в моем случае, как назвать это в этом правильном Uint32 * MyPixel = пикселей + ((iH-1) + image-> w) + iW; после этого getpixel (изображение, x, y) ;. Итак, каковы эти значения, которые печатаются 3662b0,3662ac? arent - шестнадцатеричные значения rgb? – user2711681

+0

@ user2711681 Вы не должны использовать этот тип предложения в своем коде, потому что это уже делает ужасный беспорядок. Создайте свою собственную функцию, которая получит значение пикселя, не используйте эту дерьмо. – pampeho

+0

Я не понимаю, о каких кодах вы говорите? Можете ли вы указать мне, какие коды они? – user2711681

1

Вы печатаете значение указателя MyPixel. Для того, чтобы получить значение, которое вы должны разыменования указателя на значение пикселя, как это: *MyPixel

Тогда Printf будет выглядеть следующим образом:

printf("\npixelvalue is : %d and the address of that pixel is: %p\n",*MyPixel , MyPixel); 

Другие ошибки:

  1. Ваш для петель неверны. Вы должны зацикливаться от 0 до меньшей, чем ширина или высота, иначе вы будете читать неинициализированную память.

  2. Вы не закрывали поверхность. Хотя вы только читаете пиксели, и ничего не должно идти не так, это все еще не правильно.

  3. Проверка правильности, если указатель image появляется после того, как вы уже используете указатель. Поставьте тест сразу после инициализации.

+0

ok Я буду обновлять printf как ваше предложение. Я запустил цикл из 0. Когда для блокировки поверхности перед тем, как сделать какой-либо процесс, почему это необходимо? Как проверить правильность? Поэтому я хочу изменить некоторые значения пикселей, как это сделать? – user2711681

+0

Вы правы, но я замечаю, что некоторые из них показывают, как показано как ff0000, некоторые как ff00, только некоторые из них, как ff0000ff, почему это все havign в другом формате? – user2711681

+0

@ user2711681 Ведущие нули не печатаются. – this

Смежные вопросы