Хочу отконвертировать BMP-изображение из 24 бит на пиксель в 16 бит. Подскажите что я делаю неправильно при записи файла, тк его не открыть? Код (Text): #define RGB16(red, green, blue) ( ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3)) void LoadBitmap() { BITMAPINFOHEADER infoheader; WORD *bitmapData; WORD *bitmapDone; FILE *bitmapFile; BYTE red, green, blue; bitmapFile = fopen("my.bmp", "rb"); fseek(bitmapFile, sizeof(BITMAPFILEHEADER), SEEK_SET); fread(&infoheader, sizeof(BITMAPINFOHEADER), 1, bitmapFile); bitmapData = new WORD[infoheader.biWidth * infoheader.biHeight]; bitmapDone = new WORD[infoheader.biWidth * infoheader.biHeight]; for( int y=0; y<infoheader.biHeight; ++y) { for( int x=0; x<infoheader.biWidth; ++x) { fread(&blue, sizeof(BYTE), 1, bitmapFile); fread(&green, sizeof(BYTE), 1, bitmapFile); fread(&red, sizeof(BYTE), 1, bitmapFile); bitmapData[y*infoheader.biWidth + x] = RGB16(red, green, blue); } } int heightIndex = 0; for(int y = infoheader.biHeight-1; y>=0; --y) { for( int x=0; x<infoheader.biWidth; ++x) bitmapDone[heightIndex*infoheader.biWidth + x] = bitmapData[y*infoheader.biWidth + x]; ++heightIndex; } BITMAPFILEHEADER bfh; memset (&bfh, 0, sizeof(bfh)); bfh.bfType = 0x4D42; bfh.bfOffBits = sizeof(bfh) + sizeof(infoheader) + 1024; bfh.bfSize = bfh.bfOffBits + 2*sizeof(BYTE) * infoheader.biWidth * infoheader.biHeight + infoheader.biHeight * ((2*sizeof(BYTE) * infoheader.biWidth) % 4); FILE *pFile = fopen("cool.bmp", "wb"); UINT nWrittenFileHeaderSize = fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), pFile); //fwrite(, , ) UINT nWrittenInfoHeaderSize = fwrite(&infoheader, 1, sizeof(BITMAPINFOHEADER), pFile); for( int y=0; y<infoheader.biHeight; ++y) { for( int x=0; x<infoheader.biWidth; ++x) { fwrite(&bitmapDone[y*infoheader.biWidth + x], 2*sizeof(BYTE), 1, pFile); } } }
jawbreaker 1) Зачем ты считываешь и записываешь растр попиксельно? Пиши сразу Код (Text): WriteFile(pFile,&bitmapDone,infoheader.biWidth*infoheader.biHeight<<1,&numBytes,0); 2) Не хватает Этой строки Код (Text): infoheader.biBitCount=16 3) Я не знаю C, но похоже ты перепутал 2 и 3 параметр в fwrite Сравни это: fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), pFile); fwrite(&infoheader, 1, sizeof(BITMAPINFOHEADER), pFile); и это: fwrite(&bitmapDone[y*infoheader.biWidth + x], 2*sizeof(BYTE), 1, pFile); Добавлено: 4) Не понял зачем отражать изображение по вертикали? Код (Text): bitmapDone[heightIndex*infoheader.biWidth + x] = bitmapData[y*infoheader.biWidth + x]; 5) Кажется преобразовать в RGB16 можно, разделив 24 битное число на 31.6160499759731 то есть Код (Text): RGB16=round(RGB24/31.6160499759731);
murder так как возращаемые значения не проверяются, то монописсуально какой порядок 2 и 3 аргументов.