Зеркальное отображение растрового изображения - PullRequest
0 голосов
/ 19 марта 2019

Я хотел бы знать, как я могу инвертировать изображение. Я собираю изображение и хочу преобразовать его в формат BMP. У меня уже есть заголовок, мне просто нужно инвертировать данные изображения, потому что в bmp изображение должно быть инвертировано, чтобы оно правильно печаталось на принтере.

Я получил улучшенный алгоритм. Однако этот код инвертирует только изображения с

разрешение: 60x60 и bpp = 1. Я хочу иметь максимальное ограничение для своего изображения, разрешение 384х120. У кого-нибудь есть идеи, как я могу улучшить этот код? В случае изображения с разрешением 10x10 пикселей, будет ли это для того, чтобы переворачивать строку за строкой, должен ли я переворачивать 10 бит на строку? Ниже я представляю изображение и код.

    unsigned char icon[] ={ 
        //HEADER
        0x42, 0x4D,             // 0-1   BM 
        0xF6, 0x07, 0x00, 0x00, // 2-5   uint32 filesize (not reliable) 
        0x00, 0x00, 0x00, 0x00, // 6-9   uint32 0
        0x76, 0x00, 0x00, 0x00, // 10-13 uint32 bitmapOffset

        0x28, 0x00, 0x00, 0x00, // 14-17 uint32 info size
        0x3C, 0x00, 0x00, 0x00, // 18-21 int32  width
        0x3C, 0x00, 0x00, 0x00, // 22-25 int32  height
        0x01, 0x00,             // 26-27 uint16 nplanes
        0x04, 0x00,             // 28-29 uint16 bits per pixel bpp bitCount 
        0x00, 0x00, 0x00, 0x00, // 30-33 uint32 compression flag
        0x00, 0x00, 0x00, 0x00, // 34-37 uint32 image size in bytes
        0xC4, 0x0E, 0x00, 0x00, // 38-41 int32  biXPelsPerMeter 
        0xC4, 0x0E, 0x00, 0x00, // 32-45 int32  biYPelsPerMeter
        0x00, 0x00, 0x00, 0x00, // 46-49 uint32 colors used
        0x00, 0x00, 0x00, 0x00, // 50-53 uint32 important color count
        //*********************************************
        //Image data:
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 
    0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 
    0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 
    0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0x83, 0x99, 0x99, 0x33, 0x3B, 0xB8, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xF8, 0x99, 0x99, 0x99, 0x99, 0x33, 0xBB, 0xB3, 0x3B, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 
    0x99, 0x99, 0x99, 0x99, 0x33, 0x8B, 0xBB, 0xB3, 0xBB, 0x3B, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 
    0x99, 0x99, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xB3, 0x3B, 0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x99, 
    0x97, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0x3B, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x99, 0x93, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0xB3, 0x8F, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x79, 0x99, 0x8F, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3B, 0x38, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x99, 0x98, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xB3, 0x8F, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x99, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x38, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x98, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xB3, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x99, 0x8F, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3B, 0xBF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x93, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x38, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x9F, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBB, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x99, 0x8F, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x33, 0x8F, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0xBF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x38, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x3B, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x77, 0x8F, 0xFF, 0xFF, 0x77, 0x8F, 0xFF, 0xF8, 
    0x77, 0xFF, 0x77, 0x77, 0x7F, 0xFF, 0xF8, 0x77, 0x77, 0x8F, 0xF8, 0x77, 0xFF, 0xFF, 0xF7, 0x78, 
    0xF7, 0x78, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x40, 0x7F, 0xFF, 0xFF, 0x44, 0x6F, 0xFF, 0xF4, 
    0x44, 0xF4, 0x44, 0x44, 0x44, 0x8F, 0x80, 0x44, 0x44, 0x46, 0xF8, 0x00, 0x7F, 0xFF, 0x84, 0x07, 
    0xF4, 0x06, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x7F, 0xFF, 0xFF, 0x74, 0x4F, 0xFF, 0xF4, 
    0x47, 0xF6, 0x46, 0x66, 0x44, 0x4F, 0x84, 0x46, 0x64, 0x44, 0x7F, 0x44, 0x6F, 0xFF, 0x74, 0x48, 
    0xF6, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x7F, 0xFF, 0xFF, 0x84, 0x46, 0x66, 0x64, 
    0x48, 0xFF, 0xFF, 0xFF, 0x64, 0x0F, 0xF8, 0xFF, 0xF8, 0x44, 0x6F, 0x74, 0x46, 0x67, 0x64, 0x4F, 
    0xF6, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x7F, 0xFF, 0xFF, 0xF4, 0x44, 0x44, 0x44, 
    0x4F, 0xFF, 0xFF, 0xFF, 0x74, 0x0F, 0xFF, 0xFF, 0xFF, 0x44, 0x6F, 0x84, 0x44, 0x44, 0x44, 0x6F, 
    0xF6, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x44, 0x46, 0x8F, 0xF6, 0x44, 0x77, 0x44, 
    0x7F, 0xFF, 0xF8, 0x76, 0x44, 0x4F, 0xFF, 0xF8, 0x76, 0x44, 0x6F, 0xF4, 0x46, 0x77, 0x44, 0x8F, 
    0xF6, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x44, 0x44, 0x48, 0xF7, 0x44, 0xFF, 0x44, 
    0x8F, 0xFF, 0x64, 0x44, 0x44, 0x7F, 0xF8, 0x64, 0x44, 0x44, 0x8F, 0xF6, 0x46, 0xF7, 0x44, 0xFF, 
    0xF6, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x67, 0x74, 0x44, 0xFF, 0x44, 0x88, 0x44, 
    0xFF, 0xF6, 0x44, 0x44, 0x68, 0xFF, 0xF4, 0x44, 0x44, 0x68, 0xFF, 0xF7, 0x44, 0xF6, 0x46, 0xFF, 
    0xF6, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x7F, 0xF6, 0x44, 0xFF, 0x44, 0x77, 0x46, 
    0xFF, 0xF4, 0x44, 0x8F, 0xFF, 0xFF, 0x84, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, 0x84, 0x47, 0xFF, 
    0xF6, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x7F, 0xF6, 0x44, 0xFF, 0x74, 0x64, 0x47, 
    0xFF, 0xF4, 0x46, 0xFF, 0xFF, 0xFF, 0x74, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, 0x74, 0x48, 0xFF, 
    0xF6, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x67, 0x74, 0x44, 0xFF, 0x84, 0x44, 0x48, 
    0xFF, 0xF4, 0x44, 0x77, 0x76, 0x8F, 0x84, 0x44, 0x77, 0x76, 0xFF, 0xFF, 0x74, 0x44, 0x4F, 0xFF, 
    0xF6, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x44, 0x44, 0x44, 0x48, 0xFF, 0xF4, 0x44, 0x4F, 
    0xFF, 0xF7, 0x44, 0x44, 0x40, 0x6F, 0xF6, 0x44, 0x44, 0x40, 0x8F, 0xFF, 0x84, 0x44, 0x7F, 0xFF, 
    0xF4, 0x46, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x66, 0x66, 0x66, 0x8F, 0xFF, 0xF7, 0x66, 0x7F, 
    0xFF, 0xFF, 0x86, 0x44, 0x66, 0x8F, 0xFF, 0x76, 0x44, 0x67, 0xFF, 0xFF, 0xF6, 0x64, 0x8F, 0xFF, 
    0xF6, 0x67, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0x8F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xF7, 0x06, 0x8F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x66, 
    0xFF, 0x64, 0x08, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x68, 
    0xFF, 0xF7, 0x4F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x6F, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x66, 0x7F, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x66, 0x8F, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xB8, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x67, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBB, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x6F, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x66, 0x8F, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xBB, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x67, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBB, 0xBF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x66, 0x6F, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x66, 0x66, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBB, 0xB8, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x66, 0x6F, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, 
    0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x66, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xBB, 
    0xBB, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x66, 0x66, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 
    0xBB, 0xBB, 0xBB, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFB, 0xBB, 0xBB, 0xBB, 0xBB, 0x66, 0x66, 0x66, 0x66, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xF8, 0xBB, 0xBB, 0xBB, 0x66, 0x66, 0x6E, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xF8, 0x88, 0x88, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 
                    };

int getBytesPerRow(int bpp, int width)
{
    switch (bpp)
    {
    case 1: return (width >> 3) + ((width & 0x7) == 0 ? 0 : 1);
    case 4: return (width >> 1) + ((width & 0x1) == 0 ? 0 : 1);
    case 8: return width;
    case 24: return width * 3;
    default: return -1;
    }
}

void ImageMirror(uchar *bmpBytes, int width, int height, int lenght, int bpp)
{

    int32 bmpRowLength;
    int32 imgRowLength;
    int32 imgRow;

    struct ImageInfo imageInfo;

    imageInfo.width = width;
    imageInfo.height = height;
    imageInfo.bpp = bpp;

    // imRowLength is the number of bytes that represent each line
    // bmpRowLength is the length of line in pixels and should be rounded to the next 32 bits boundary
    imgRowLength = getBytesPerRow(imageInfo.bpp, imageInfo.width);
    bmpRowLength = (imgRowLength & 0xFFFC) + ((imgRowLength & 3) == 0 ? 0 : 4);

    imageInfo.imageLength = imgRowLength * imageInfo.height;

    imageInfo.imageBytes = wabaVm->Malloc(imageInfo.imageLength);

    // invert the image, so it's stored upside up
    for (imgRow = 0; imgRow < imageInfo.height; imgRow++)
    {
        // if row size is less than the number of pixels per row
        int index = imgRow * imgRowLength;
        uchar *bmpRow = &bmpBytes[(imageInfo.height - imgRow - 1) * bmpRowLength];
        uchar *imgRow = &imageInfo.imageBytes[index];
        memcpy(imgRow, bmpRow, imgRowLength);
    }
    memset(bmpBytes, 0, lenght);
    memcpy(bmpBytes, imageInfo.imageBytes, lenght);
    Free(imageInfo.imageBytes);
}

1 Ответ

1 голос
/ 22 марта 2019

У вас есть 4-битное растровое изображение.Это означает, что каждый пиксель составляет 4 бита, и 2 пикселя (8 бит) упакованы в один байт.Перелистывание строки усложняется, потому что вы также должны переворачивать каждый байт.

Кроме того, 4-битное растровое изображение (а также 1-битное и 8-битное) имеют таблицу палитр, которая появляется после заголовка файла растрового изображения и информационного заголовка.,Обязательно пропустите таблицу палитр, вы не хотите переворачивать таблицу палитр.Используйте библиотеку изображений, если это возможно.В противном случае используйте этот код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>

#pragma pack(push, 1)
typedef struct {
    int16_t bfType;
    int32_t bfSize;
    int16_t bfReserved1;
    int16_t bfReserved2;
    int32_t bfOffBits;
} BITMAPFILEHEADER;

typedef struct {
    int32_t biSize;
    int32_t biWidth;
    int32_t biHeight;
    int16_t biPlanes;
    int16_t biBitCount;
    int32_t biCompression;
    int32_t biSizeImage;
    int32_t biXPelsPerMeter;
    int32_t biYPelsPerMeter;
    int32_t biClrUsed;
    int32_t biClrImportant;
} BITMAPINFOHEADER;
#pragma pack(pop)

unsigned char icon[] = { ... }

int main()
{
    if(sizeof(BITMAPFILEHEADER) != 14 || sizeof(BITMAPINFOHEADER) != 40)
    {
        printf("Wrong packing pragma. Make sure structure is packed.");
        return 0;
    }

    BITMAPFILEHEADER bmpheader;
    BITMAPINFOHEADER bmpinfo;

    memcpy(&bmpheader, icon, sizeof(BITMAPFILEHEADER));
    memcpy(&bmpinfo, icon + sizeof(BITMAPFILEHEADER), sizeof(BITMAPINFOHEADER));

    int width = bmpinfo.biWidth;
    int height = bmpinfo.biHeight;
    int bpp = bmpinfo.biBitCount;
    int width_in_bytes = ((width * bpp + 31) / 32) * 4;
    int image_size = width_in_bytes * height;
    int palette_size = 0;
    switch(bpp)
    {
    case 1: palette_size = 2 * 4; break;
    case 4: palette_size = 16 * 4; break;
    case 8: palette_size = 256 * 4; break;
    default:break;
    }

    int palette_offset = sizeof(bmpheader) + sizeof(bmpinfo);
    int bits_offset = palette_offset + palette_size;

    unsigned char *palette = &icon[palette_offset];
    unsigned char *bits = &icon[bits_offset];
    unsigned char *invert = malloc(image_size);

    //copy byte by byte:
    //try this loop first to make sure the bitmap is copied correctly
    for(int y = height - 1; y >= 0; y--)
    {
        int offset = y * width_in_bytes;
        for(int x = 0; x < width_in_bytes; x++)
        {
            invert[offset + x] = bits[offset + x];
        }
    }

    //now lets try to flip the bitmap
    //this loop is for 4-bit bitmap only 
    if(bpp == 4)
    {
        //track the padding:
        int gap = width_in_bytes - width / 2;

        for(int y = height - 1; y >= 0; y--)
        {
            int offset = y * width_in_bytes;
            for(int x = 0; x < width_in_bytes; x++)
            {
                int src = offset + x;
                int dst = offset + width_in_bytes - x - 1 - gap;

                if(dst < 0 || dst >= image_size)
                    continue;

                invert[dst] = bits[src];

                //2 4-bit pixels are packed in to one byte, swap the pixels:
                unsigned char p = invert[dst];
                invert[dst] = ((p & 0x0F) << 4) | ((p & 0xF0) >> 4);
            }
        }
    }

    FILE *fout = fopen("bmp.bmp", "wb");
    fwrite(&bmpheader, sizeof(bmpheader), 1, fout);
    fwrite(&bmpinfo, sizeof(bmpinfo), 1, fout);
    fwrite(palette, palette_size, 1, fout);
    fwrite(invert, 1, width_in_bytes * height, fout);

    free(invert);
    fclose(fout);

    return 0;
}
...