HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- C++ Конвертирование BMP 24 -> 8 bit (https://hlfx.ru/forum/showthread.php?threadid=2468)
Отправлено Дядя Миша 11-01-2011 в 17:09:
Цитата:
fire64 писал:
А исходники у xwad есть ?
а как жы.
Добавлено 11-01-2011 в 20:09:
Загрузчик VTF для нашего друга 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 13-01-2011 в 11:01:
В общем все прекрасно за исключением того, что половина BMP файлов получаются кривыми.
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 13-01-2011 в 11:36:
fire64 дать сохранялку бмп? Правда у меня только для 8-бит. но сохраняет жылезна.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 13-01-2011 в 11:56:
Разобрался.
Дело в том, что в BMP есть такое понятие как выравнивание.
То есть, дополнительные байты в конце каждой строки.
C++ Source Code:
int optimgsize = bih.biWidth * bih.biHeight * 3; |
int relimgsize = bfh.bfSize - bfh.bfOffBits; |
Соответственно если optimgsize и relimgsize равны, то пустых байтов нет и изображение нормально сохраняется.
Если же relimgsize больше optimgsize, то нужно дополнительно производить смещение в конце строки на relimgsize / optimgsize.__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 13-01-2011 в 12:30:
Цитата:
fire64 писал:
Дело в том, что в BMP есть такое понятие как выравнивание.
Я не понял, это ты мне рассказываешь?
твой код, кстати неправильный.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 13-01-2011 в 12:32:
Короче сделал так:
C++ Source Code:
1 | int optimgsize = bih.biWidth * bih.biHeight * 3; |
2 | int relimgsize = bfh.bfSize - bfh.bfOffBits; |
4 | int countpixels = bih.biWidth * bih.biHeight; |
5 | int countbytesalignment = relimgsize - optimgsize; |
10 | if( relimgsize == optimgsize ) |
16 | alignmentsize = countbytesalignment / countpixels; |
18 | pixeloffset = 3 + alignmentsize; |
Теперь все изображения успешно сохраняются.__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 13-01-2011 в 12:53:
C++ Source Code:
1 | qboolean Image_SaveBMP( const char *name, rgbdata_t *pix ) |
6 | RGBQUAD rgrgbPalette[256]; |
9 | byte *pb, *pbPal = NULL; |
14 | if( FS_FileExists( name, false ) && !(image.cmd_flags & IL_ALLOW_OVERWRITE )) |
15 | return false; // already existed |
17 | // bogus parameter check |
18 | if( !pix->palette || !pix->buffer ) |
27 | MsgDev( D_WARN, "Image_SaveBMP: unsupported image type %s\n", PFDesc[pix->type].name ); |
31 | pfile = FS_Open( name, "wb", false ); |
32 | if( !pfile ) return false; |
34 | // NOTE: align transparency column will sucessfully removed |
35 | // after create sprite or lump image, it's just standard requiriments |
36 | biTrueWidth = ((pix->width + 3) & ~3); |
37 | cbBmpBits = biTrueWidth * pix->height; |
38 | cbPalBytes = 256 * sizeof( RGBQUAD ); |
40 | // Bogus file header check |
41 | bmfh.bfType = MAKEWORD( 'B', 'M' ); |
42 | bmfh.bfSize = sizeof(bmfh) + sizeof(bmih) + cbBmpBits + cbPalBytes; |
45 | bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmih) + cbPalBytes; |
48 | FS_Write( pfile, &bmfh, sizeof(bmfh)); |
51 | bmih.biSize = sizeof(bmih); |
52 | bmih.biWidth = biTrueWidth; |
53 | bmih.biHeight = pix->height; |
56 | bmih.biCompression = BI_RGB; |
58 | bmih.biXPelsPerMeter = 0; |
59 | bmih.biYPelsPerMeter = 0; |
61 | bmih.biClrImportant = 0; |
64 | FS_Write( pfile, &bmih, sizeof(bmih)); |
67 | // copy over used entries |
68 | for( i = 0; i < (int)bmih.biClrUsed; i++ ) |
70 | rgrgbPalette[i].rgbRed = *pb++; |
71 | rgrgbPalette[i].rgbGreen = *pb++; |
72 | rgrgbPalette[i].rgbBlue = *pb++; |
74 | // bmp feature - can store 32-bit palette if present |
75 | // some viewers e.g. fimg.exe can show alpha-chanell for it |
76 | if( pix->type == PF_INDEXED_32 ) |
77 | rgrgbPalette[i].rgbReserved = *pb++; |
78 | else rgrgbPalette[i].rgbReserved = 0; |
81 | // make last color is 0 0 255, xwad expect this (but ignore decals) |
82 | if( com.strrchr( name, '{' ) && pix->flags & IMAGE_HAS_ALPHA && !( pix->flags & IMAGE_COLORINDEX )) |
84 | rgrgbPalette[255].rgbRed = 0x00; |
85 | rgrgbPalette[255].rgbGreen = 0x00; |
86 | rgrgbPalette[255].rgbBlue = 0xFF; |
87 | rgrgbPalette[255].rgbReserved = 0x00; |
90 | // write palette( bmih.biClrUsed entries ) |
91 | cbPalBytes = bmih.biClrUsed * sizeof( RGBQUAD ); |
92 | FS_Write( pfile, rgrgbPalette, cbPalBytes ); |
93 | pbBmpBits = Mem_Alloc( Sys.imagepool, cbBmpBits ); |
94 | Mem_Set( pbBmpBits, 0xFF, cbBmpBits ); // fill buffer with last palette color |
97 | pb += (pix->height - 1) * pix->width; |
99 | for( i = 0; i < bmih.biHeight; i++ ) |
101 | Mem_Copy( &pbBmpBits[biTrueWidth * i], pb, pix->width ); |
105 | // write bitmap bits (remainder of file) |
106 | FS_Write( pfile, pbBmpBits, cbBmpBits ); |
108 | Mem_Free( pbBmpBits ); |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'