HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > C++ Конвертирование BMP 24 -> 8 bit
Страницы (3): « 1 2 [3]   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32333
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
fire64 писал:
А исходники у xwad есть ?

а как жы.

Добавлено 11-01-2011 в 20:09:

Загрузчик VTF для нашего друга

Вложение: img_vtf.rar (3.6 кб)
Этот файл был скачан 214 раз.
Дядя Миша проверил это вложение на вирусы 11-01-2011 в 17:18

__________________
My Projects: download page

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

Цитата:

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

Сообщить модератору | | IP: Записан
Сообщение: 70132

Старое сообщение 11-01-2011 17:09
-
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



В общем все прекрасно за исключением того, что половина BMP файлов получаются кривыми.

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

Сообщить модератору | | IP: Записан
Сообщение: 70204

Старое сообщение 13-01-2011 11:01
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32333
Нанёс повреждений: 392 ед.

Рейтинг



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'

Сообщить модератору | | IP: Записан
Сообщение: 70207

Старое сообщение 13-01-2011 11:36
-
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



Разобрался.
Дело в том, что в BMP есть такое понятие как выравнивание.
То есть, дополнительные байты в конце каждой строки.

C++ Source Code:
int optimgsize = bih.biWidth * bih.biHeight * 3;
int relimgsize = bfh.bfSize -  bfh.bfOffBits;


Соответственно если optimgsize и relimgsize равны, то пустых байтов нет и изображение нормально сохраняется.

Если же relimgsize больше optimgsize, то нужно дополнительно производить смещение в конце строки на relimgsize / optimgsize.

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

Сообщить модератору | | IP: Записан
Сообщение: 70208

Старое сообщение 13-01-2011 11:56
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32333
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
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'

Сообщить модератору | | IP: Записан
Сообщение: 70212

Старое сообщение 13-01-2011 12:30
-
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



Короче сделал так:

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
}


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

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

Сообщить модератору | | IP: Записан
Сообщение: 70213

Старое сообщение 13-01-2011 12:32
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32333
Нанёс повреждений: 392 ед.

Рейтинг



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'

Сообщить модератору | | IP: Записан
Сообщение: 70215

Старое сообщение 13-01-2011 12:53
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 16:42. Новая тема    Ответить
Страницы (3): « 1 2 [3]   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > C++ Конвертирование BMP 24 -> 8 bit
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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