Как изменить, изменить, вырезать и поменять пиксели из BITMAP - PullRequest
0 голосов
/ 04 февраля 2011

Я хочу изменить растровое изображение:

  • изменить (изменить) положение пикселя (для последующего исправления «рыбий глаз»)

  • разделить растровое изображениев суб-растровых изображениях (например, сделать 4 растровых изображения из 1) (для последующего текстурирования различных GL_QUADS)

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

Пример следующего кода работает и создает текстуру из файла:

HBITMAP hbpInput = (HBITMAP)::LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

BITMAP bmpOutput;
::GetObject (hbpInput, sizeof (bmpOutput), &bmpOutput);

(...)

glTexImage2D(GL_TEXTURE_2D, 0, 3, bmpOutput.bmWidth, bmpOutput.bmHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bmpOutput.bmBits);

Какой код необходим для получения Bit-Array?

Я уже пробовал GetDIBits (), ноэто не работает для ИЗОБРАЖЕНИЯ (структуры), как вы наверняка знаете:)

Есть конкретные идеи, как можно изменить положение пикселей?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 05 февраля 2011

Последний аргумент в следующем вызове - это байтовый массив для пикселей:

glTexImage2D(GL_TEXTURE_2D, 0, 3, bmpOutput.bmWidth, bmpOutput.bmHeight,
             0, GL_RGB, GL_UNSIGNED_BYTE, bmpOutput.bmBits);

Это означает, что bmpOutput.bmBits указывает на первый байт в массиве, содержащем следующее количество байтов:

3 * bmpOutput.bmWidth * bmpOutput.bmHeight

Это означает 3 байта на пиксель (по одному для красного, зеленого, синего).

Сказав все это, основываясь на вашем вопросе, звучит так, как будто вы действительно ищетечтобы иметь возможность отображать разные части текстуры на разные квады.Для этого вы можете использовать текстурный атлас .Используйте только один объект текстуры, но настройте координаты текстуры для каждого квадратора, чтобы отобразить различные части изображения текстуры.

0 голосов
/ 04 февраля 2011

Ну, поскольку растровые изображения - это такие простые файлы, вы можете просто прочитать заголовок и построить массив / вектор пикселей и отредактировать их.

Вот функция, которую я написал давно, хотя она заполненаплохие привычки кодирования.

m_imagefile - это базовая структура с важной информацией об изображении, такой как ширина, высота, bpp, формат и необработанный массив байтов.

m_imagefile *loadBMP(char *Filename) {
    FILE        *BMPFile=NULL;
    errno_t     error;
    m_imagefile *IMG=NULL;

    error=fopen_s(&BMPFile, Filename, "rb");
    if(error!=0) {
        return NULL;
    }

    IMG=new m_imagefile;

    GLshort magic=0;

    fseek(BMPFile, 0x00, SEEK_SET);
    fread(&magic, sizeof(GLshort), 1, BMPFile);
    fseek(BMPFile, 0x12, SEEK_SET);
    fread(&IMG->width, sizeof(GLint), 1, BMPFile);
    fseek(BMPFile, 0x16, SEEK_SET);
    fread(&IMG->height, sizeof(GLint), 1, BMPFile);
    fseek(BMPFile, 0x1C, SEEK_SET);
    fread(&IMG->bpp, sizeof(GLshort), 1, BMPFile);

    //First 2 bytes should be 0x424d or "BM" in ASCII
    if(IMG->width == 0 || IMG->height == 0 || !(magic & 0x424D)) {
        fclose(BMPFile);
        delete IMG;
        return NULL;
    }

    //Bitmaps are stored as BGR, not RGB
    if(IMG->bpp==24) {
        IMG->format = GL_BGR_EXT;
    } else if(IMG->bpp==32) {
        IMG->format = GL_BGRA_EXT;
    } else {
        fclose(BMPFile);
        delete IMG;
        return NULL;
    }

    IMG->data=new GLubyte[IMG->height*IMG->width*IMG->bpp/8];
    fseek(BMPFile, 54, SEEK_SET);
    fread(IMG->data, sizeof(GLbyte), IMG->height*IMG->width*IMG->bpp/8, BMPFile);

    fclose(BMPFile);

    return IMG;
 }
...