HLFX.Ru Forum Страницы (3): « 1 2 [3]
Показать все 37 сообщений этой темы на одной странице

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;
3
 
4
int countpixels = bih.biWidth * bih.biHeight;
5
int countbytesalignment = relimgsize - optimgsize;
6
int alignmentsize = 0;
7
 
8
int pixeloffset = 0;
9
 
10
if( relimgsize == optimgsize )
11
{
12
  pixeloffset = 3;
13
}
14
else
15
{
16
  alignmentsize = countbytesalignment / countpixels;
17
 
18
  pixeloffset = 3 + alignmentsize;
19
}


Теперь все изображения успешно сохраняются.

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Дядя Миша 13-01-2011 в 12:53:

C++ Source Code:
1
qboolean Image_SaveBMP( const char *name, rgbdata_t *pix )
2
{
3
  file_t		*pfile = NULL;
4
  BITMAPFILEHEADER	bmfh;
5
  BITMAPINFOHEADER	bmih;
6
  RGBQUAD		rgrgbPalette[256];
7
  dword		cbBmpBits;
8
  byte*		pbBmpBits;
9
  byte		*pb, *pbPal = NULL;
10
  dword		cbPalBytes;
11
  dword		biTrueWidth;
12
  int		i, rc = 0;
13
 
14
  if( FS_FileExists( name, false ) && !(image.cmd_flags & IL_ALLOW_OVERWRITE ))
15
    return false; // already existed
16
 
17
  // bogus parameter check
18
  if( !pix->palette || !pix->buffer )
19
    return false;
20
 
21
  switch( pix->type )
22
  {
23
  case PF_INDEXED_24:
24
    case PF_INDEXED_32:
25
        break;
26
    default:
27
        MsgDev( D_WARN, "Image_SaveBMP: unsupported image type %s\n", PFDesc[pix->type].name );
28
      return false;
29
    }
30
 
31
  pfile = FS_Open( name, "wb", false );
32
  if( !pfile ) return false;
33
 
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 );
39
 
40
  // Bogus file header check
41
  bmfh.bfType = MAKEWORD( 'B', 'M' );
42
  bmfh.bfSize = sizeof(bmfh) + sizeof(bmih) + cbBmpBits + cbPalBytes;
43
  bmfh.bfReserved1 = 0;
44
  bmfh.bfReserved2 = 0;
45
  bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmih) + cbPalBytes;
46
 
47
  // write header
48
  FS_Write( pfile, &bmfh, sizeof(bmfh));
49
 
50
  // size of structure
51
  bmih.biSize = sizeof(bmih);
52
  bmih.biWidth = biTrueWidth;
53
  bmih.biHeight = pix->height;
54
  bmih.biPlanes = 1;
55
  bmih.biBitCount = 8;
56
  bmih.biCompression = BI_RGB;
57
  bmih.biSizeImage = 0;
58
  bmih.biXPelsPerMeter = 0;
59
  bmih.biYPelsPerMeter = 0;
60
  bmih.biClrUsed = 256;
61
  bmih.biClrImportant = 0;
62
 
63
  // Write info header
64
  FS_Write( pfile, &bmih, sizeof(bmih));
65
  pb = pix->palette;
66
 
67
  // copy over used entries
68
  for( i = 0; i < (int)bmih.biClrUsed; i++ )
69
  {
70
    rgrgbPalette[i].rgbRed = *pb++;
71
    rgrgbPalette[i].rgbGreen = *pb++;
72
    rgrgbPalette[i].rgbBlue = *pb++;
73
 
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;
79
  }
80
 
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 ))
83
  {
84
    rgrgbPalette[255].rgbRed = 0x00;
85
    rgrgbPalette[255].rgbGreen = 0x00;
86
    rgrgbPalette[255].rgbBlue = 0xFF;
87
    rgrgbPalette[255].rgbReserved = 0x00;
88
  }
89
 
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
95
 
96
  pb = pix->buffer;
97
  pb += (pix->height - 1) * pix->width;
98
 
99
  for( i = 0; i < bmih.biHeight; i++ )
100
  {
101
    Mem_Copy( &pbBmpBits[biTrueWidth * i], pb, pix->width );
102
    pb -= pix->width;
103
  }
104
 
105
  // write bitmap bits (remainder of file)
106
  FS_Write( pfile, pbBmpBits, cbBmpBits );
107
  FS_Close( pfile );
108
  Mem_Free( pbBmpBits );
109
 
110
  return true;
111
}

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Временная зона GMT. Текущее время 15:15. Страницы (3): « 1 2 [3]
Показать все 37 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024