Платформа SDL не может отображать файлы BMP размером менее 20x20 пикселей?

Кто-нибудь знает, есть ли мин. ограничение размера для файлов BMP в структуре SDL для их отображения?
Я спрашиваю вас об этом, потому что я пробовал, но не могу правильно отображать файлы BMP размером менее 20x20 пикселей (я использую SDL для C++).

Код:

    bool successCondition = false;  
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        printf("Unable to initialize SDL: %s\n", SDL_GetError());
        return 1;
    }
    atexit(SDL_Quit);

    SDL_Surface *screen;

    screen = SDL_SetVideoMode(640, 480, 24, SDL_DOUBLEBUF);
    if (screen == NULL) {
        printf("Unable to set video mode: %s\n", SDL_GetError());
        return 1;
    }

    // nueva imagen
    Image* imgSmile = new Image("Images/smile.bmp");

    SDL_Rect src, dest;
    src.x = 0;
    src.y = 0;
    src.w = imgSmile->getWidth();
    src.h = imgSmile->getHeight();
    dest.x = 50;
    dest.y = 20;
    dest.w = imgSmile->getWidth();
    dest.h = imgSmile->getHeight();
    SDL_BlitSurface(imgSmile->getSDLSurface(), &src, screen, &dest);
    SDL_Flip(screen);

    // nueva imagen
    Image* imgSmileRe = new Image("Images/smile.bmp");


    // Achico la imagen
    imgSmileRe->resize(10, 10);

    // Pego la imagen en la pantalla
    src.x = 0;
    src.y = 0;
    src.w = imgSmileRe->getWidth();
    src.h = imgSmileRe->getHeight();
    dest.x = 100;
    dest.y = 20;
    dest.w = imgSmileRe->getWidth();
    dest.h = imgSmileRe->getHeight();
    SDL_BlitSurface(imgSmileRe->getSDLSurface(), &src, screen, &dest);
    SDL_Flip(screen);


    //esperar para cerrar
    SDL_Event e;
    bool running = true;

    while(running) 
    {
        while(SDL_PollEvent(&e)) 
        {
            switch(e.type)
            {
                case SDL_QUIT:
                    running = false;
                    SDL_Quit();
                    break;
            }
        }
    }

    // libero memoria
    free(imgSmile);
    free(imgSmileRe);

    successCondition = true;

    return successCondition;

}  

И код для изменения размера:

void Image::resize(int newWidth, int newHeight)
{
    int widthSrc    = this->getWidth();
    int heightSrc   = this->getHeight();

    // Empty new image
    Image* temp = new Image(newWidth, newHeight);

    int posXDst = 0;
    int posYDst = 0;

    for(int posYSrc = 0; posYSrc < heightSrc ; posYSrc++){


        for(int posXSrc = 0; posXSrc < widthSrc; posXSrc++){

            posXDst = (posXSrc * newWidth) / widthSrc;
            posYDst = (posYSrc * newHeight) / heightSrc;

            Uint32 pixelImg = this->getPixel(posXSrc, posYSrc);


            if( posXSrc > 0 && posYSrc > 0 && newWidth > widthSrc && newHeight > heightSrc ){

                int fromY = (((posYSrc-1) * newHeight) / heightSrc);
                int fromX = (((posXSrc-1) * newWidth) / widthSrc);

                // interpolacion interna
                for (int y = fromY; y <= posYDst; y++){
                    for (int x = fromX; x <= posXDst; x++){

                        // pixel y posicion superior izquierdo
                        Uint32 pixelSI = this->getPixel(posXSrc-1, posYSrc-1);
                        int xSI = ((posXSrc-1) * newWidth) / widthSrc;
                        int ySI = ((posYSrc-1) * newHeight) / heightSrc;
                        // pixel y posicion superior derecho
                        Uint32 pixelSD = this->getPixel(posXSrc, posYSrc-1);
                        int xSD = (posXSrc * newWidth) / widthSrc;
                        int ySD = ((posYSrc-1) * newHeight) / heightSrc;
                        // pixel y posicion inferior izquierdo
                        Uint32 pixelII = this->getPixel(posXSrc-1, posYSrc);
                        int xII = ((posXSrc-1) * newWidth) / widthSrc;
                        int yII = (posYSrc * newHeight) / heightSrc;

                        // obtengo el pixel interpolado
                        Uint32 interpolatedPixel = this->getInterpolatedPixel( pixelSI, xSI, ySI, 
                                                                            pixelSD, xSD, ySD, 
                                                                            pixelII, xII, yII, 
                                                                            pixelImg, posXDst, posYDst, 
                                                                            x, y, temp->getFormat());

                        // coloco el pixel en la imagen destino
                        temp->putPixel( interpolatedPixel, x, y );
                    }
                }
            }

            // Pongo el pixel en las nuevas coordenadas
            temp->putPixel( pixelImg, posXDst, posYDst);
        }
    }

    this->copy(*temp);
    free(temp);
} 

Извините за испанские комментарии. Я использую Windows XP/7, изображение представляет собой смайлик в 24-битном файле BMP размером примерно 20x20 пикселей.


person Alejo    schedule 03.05.2011    source источник
comment
Какая у вас операционная система? Как вы загружаете BMP? Что такое код?   -  person Charles Ray    schedule 03.05.2011
comment
Вероятно, что-то не так с вашей функцией изменения размера.   -  person MetaCipher    schedule 12.05.2011
comment
Было бы намного лучше, если бы вы заменили все перенаправления от источника к месту назначения в функции.   -  person devsaw    schedule 04.10.2013


Ответы (1)


Теоретически ограничений на размер BMP (в отношении SDL) нет.

person oktalBlizzard    schedule 08.05.2011
comment
Это правда, что мы делали неправильно, так это то, что мы не учли шаг изображения, используемый для выравнивания битов в изображении. - person Alejo; 27.05.2011