- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
bool BMPTextureLoader::Load (GraphicContent **content, string file_name)
{
int width, height;
int bpp;
unsigned char *pixels;
ifstream file (file_name.c_str());
char temp[4];
long unsigned int data_shift;
//Read BMP identifier (bfType)
file.read(temp,2);
temp[2] = '\0';
if ((temp[0] != 'B') || (temp[1] != 'M'))
{
return false;
}
//Ignore file size and two reserved zero (bfSize, bfReserved1, bfReserved2)
file.ignore(8);
//Read pixel-data shift (bfOffBits)
file.read(temp,4);
data_shift = 0;
for (int i=0; i<4; i++)
{
data_shift += (int)(temp[i]) * pow(256.0,i);
}
if (data_shift < 54)
{
return false;
}
//Ignore information data size (biSize)
file.ignore(4);
//Read image width (biWidth)
file.read(temp,4);
width = 0;
for (int i=0; i<4; i++)
{
width += (int)(temp[i]) * pow(256.0,i);
}
if (width < 0)
{
return false;
}
//Read image height (biHeight)
file.read(temp,4);
height = 0;
for (int i=0; i<4; i++)
height += (int)(temp[i]) * pow(256.0,i);
if (height < 0)
{
return false;
}
//Read mandatory 1 (biPlanes)
file.ignore(2);
//Read bite per pixel (biBitCount)
file.read(temp,2);
int bipp = 0;
bipp += (int)(temp[0]) + (int)(temp[1])*256;
if ((bipp <= 0) || (bipp / 8. != 3))
{
return false;
}
bpp = 3;
//Read compression type (biCompression)
file.read(temp,4);
int c_type = 0;
for (int i=0; i<4; i++)
{
c_type += (int)(temp[i]) * pow(256.0,i);
}
if (c_type != 0)
{
return false;
}
file.close();
file.open(file_name);
file.ignore (data_shift);
//Read pixel data
pixels = new unsigned char[width*height*bpp];
for (int i=height-1; i>=0; i--)
{
for (int j=0; j<width; j++)
{
file.read(reinterpret_cast<char*>(&pixels[i*width*bpp + j*bpp + 2]), 1);
file.read(reinterpret_cast<char*>(&pixels[i*width*bpp + j*bpp + 1]), 1);
file.read(reinterpret_cast<char*>(&pixels[i*width*bpp + j*bpp]), 1);
}
}
//Create texture
Terminal terminal;
Считываю BMP файл. Размеры, количество бит на пиксель и тип сжатия считываются нормально. Бит на пиксель 24, сжатия нет(0). Дальше я переоткрываю файл и отступаю нужное кол-во пикселей (смещение данных). После этого считываю данные о цветах пикселей. С рисунками нарисованными непосредственно мной всё проходит нормально. Но с картинками взятыми из интернета происходит сбой. После определённого пикселя считывание прекращается. По дебагу получается что при достижение этого пикселя наступает конец файла. Пробовал вырезать куски изображения из нета и переносить в свой файл. Одни куски переносятся и всё нормально, другие обрывают считывание. Наблюдал эту проблему у нескольких рисунков. Возможно кто-то сталкивался с такой проблемой?
Источник: http://www.gamedev.ru/code/forum/?id=144831
sanchousf 08.03.2011 12:18 # 0
pow(256.0,i)
file.read(reinterpret_cast<char*>(&pixel s[i*width*bpp + j*bpp + 2]), 1);
file.read(reinterpret_cast<char*>(&pixel s[i*width*bpp + j*bpp + 1]), 1);
file.read(reinterpret_cast<char*>(&pixel s[i*width*bpp + j*bpp]), 1);
Жесть :)
ctm 08.03.2011 21:58 # 0
ну и int32 читать как 1 int32, а не как 4 int8
gegMOPO4 08.03.2011 22:07 # −1
А вот так делать не стоит.
ctm 09.03.2011 07:35 # 0
gegMOPO4 09.03.2011 10:15 # 0
TarasB 09.03.2011 10:04 # +1
gegMOPO4 09.03.2011 10:17 # 0
TarasB 09.03.2011 10:39 # 0
gegMOPO4 09.03.2011 11:30 # 0
TarasB 09.03.2011 11:39 # 0
gegMOPO4 09.03.2011 12:45 # 0
TarasB 09.03.2011 15:14 # 0
gegMOPO4 09.03.2011 15:16 # 0
TarasB 09.03.2011 10:04 # 0
bugmenot 09.03.2011 10:30 # 0
absolut 09.03.2011 11:15 # +3
Lure Of Chaos 09.03.2011 13:27 # +1
bugmenot 09.03.2011 17:05 # 0
qweqwe 25.08.2021 10:12 # 0