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'