改变位图C ++中的RGB像素

时间:2015-05-18 12:44:48

标签: c++ bitmap

我正在尝试编写一个函数,它将所有RGB(255,0,0)像素更改为RGB(255,0,255),但它似乎不起作用:D有人能告诉我它为什么没有'工作/告诉我正确的方法。所有批评都赞赏。 这是我的代码的一部分:

#include <stdio.h>
#include <Windows.h>
#include <stdint.h>

struct BmpSignature
{
    unsigned char data[2];
};

#pragma pack(1)
struct BmpHeader
{
    BmpSignature signature;
    uint32_t fileSize;
    uint16_t reserved1;
    uint16_t reserved2;
    uint32_t dataOffset;
};

struct BmpDib
{
    uint32_t dibSize;
    int32_t  imageWidth;
    int32_t  imageHeight;
    uint16_t colorPlaneCount;
    uint16_t pixelSize;
    uint32_t compressMethod;
    uint32_t bitmapByteCount;
    int32_t  horizontalResolution;
    int32_t  verticalResolution;
    uint32_t colorCount;
    uint32_t importantColorCount;
};
struct Color
{
    unsigned char blue;
    unsigned char green;
    unsigned char red;
};
struct PixelArray
{
    Color **pixels;
    uint32_t rowCount;
    uint32_t columnCount;
};
void changeBmp(PixelArray &p)
{
    for (int i = 0; i < p.rowCount; i++)
    for (int j = 0; j < p.columnCount; j++)
    {
        if (p.pixels[i][j].red == 255 && p.pixels[i][j].green == 0 && p.pixels[i][j].blue == 0)
        {
            p.pixels[i][j].blue = 255;
        }
    }
}
void readBmpPixelArray(FILE *f, BmpHeader header, BmpDib dib, PixelArray &data)
{
    if (f == NULL)
        return;

    data.rowCount = dib.imageHeight;
    data.columnCount = dib.imageWidth;
    data.pixels = new Color*[data.rowCount];

    char paddingCount = (4 - (dib.imageWidth * (dib.pixelSize / 8) % 4)) % 4;

    fseek(f, header.dataOffset, 0L);

    for (int i = 0; i < data.rowCount; i++)
    {
        scanBmpPixelLine(f, data.pixels[data.rowCount - i - 1], dib.imageWidth);
        skipBmpPadding(f, paddingCount);
    }
}

void writeBmpPixelArray(FILE *f, BmpHeader header, BmpDib dib, PixelArray &data)
{
    if (f == NULL)
        return;

    data.rowCount = dib.imageHeight;
    data.columnCount = dib.imageWidth;

    char paddingCount = (4 - (dib.imageWidth * (dib.pixelSize / 8) % 4)) % 4;

    fseek(f, header.dataOffset, 0L);

    for (int i = 0; i < data.rowCount; i++)
    {
        writeBmpPixelLine(f, data.pixels[data.rowCount - i - 1], dib.imageWidth);
        addBmpPadding(f, paddingCount);
    }
}


void writeBmpPixelLine(FILE *f, Color *&line, uint32_t length)
{
    if (f == NULL)
        return;

    fwrite(line, sizeof(Color), length, f);
}

void scanBmpPixelLine(FILE *f, Color *&line, uint32_t length)
{
    if (f == NULL)
        return;

    line = new Color[length];
    fread(line, sizeof(Color), length, f);
}

void addBmpPadding(FILE *f, char count)
{
    if (f == NULL)
        return;

    if (count == 0)
        return;

    char padding[3];
    fwrite(padding, count, 1, f);
}

void skipBmpPadding(FILE *f, char count)
{
    if (f == NULL)
        return;

    if (count == 0)
        return;

    char padding[3];
    fread(padding, count, 1, f);
}

void drawBmp(BmpDib dib, PixelArray data)
{
    HWND console = GetConsoleWindow();
    HDC hdc = GetDC(console);

    for (int i = 0; i < dib.imageHeight; i++)
    for (int j = 0; j < dib.imageWidth; j++)
    {
        Color pixel = data.pixels[i][j];
        SetPixel(hdc, j, i, RGB(pixel.red, pixel.green, pixel.blue));
    }

    ReleaseDC(console, hdc);
}

void releaseBmpPixelArray(PixelArray data)
{
    for (int i = 0; i < data.rowCount; i++)
        delete[]data.pixels[i];

    delete[]data.pixels;
}
int main()
{
    BmpHeader header;
    BmpDib info;
    PixelArray data;
    FILE * inputBMP;
    inputBMP = fopen("D:\\Projects\\bitmap\\yoyo.bmp", "rb");


    readBmpHeader(inputBMP, header);
    printBmpHeader(header);
    readBmpDib(inputBMP, info);
    printBmpDib(info);

    readBmpPixelArray(inputBMP, header, info, data);

    HWND console = GetConsoleWindow();
    if (console != NULL){ MoveWindow(console, 0, 0, 800, 600, TRUE); }

    changeBmp(data);
    drawBmp(info, data);
    releaseBmpPixelArray(data);


    fclose(inputBMP);

    Sleep(100);

    return 0;
}

0 个答案:

没有答案