BMP формат: хитро и не так тривиально, как думалось
- Информация о материале
- Автор: Super User
- Родительская категория: Заметки
- Категория: Программирование
- Просмотров: 3098
Скашивается картинка при чтении НЕ ВСЕХ BMP-шек?
Общую структуру формата можно посмотреть здесь:
Цитата, на что обратить внимание: каждая строка добивается ненужными байтами чтобы длина строки была кратна 4 байтам.
Пример кода при попиксельном чтении на Си (24-битная глубина):
Пример кода на FoxPro (считывание организовано по-другому, более похоже к считыванию "построчно"):
Не сдержусь и процитирую тут, чтобы не потерялось, грабли, как выяснилось знатные(забыть о мусоре, т.к. картинка считалась верно.... случайно совпало с выравниванием):
lnFH = fopen('test.bmp')
if lnFH <= 0
? 'Файл не открылся'
return
endif
lcHead = fread(lnFH, 14) && структура BITMAPFILEHEADER
if !left(lcHead, 2) == 'BM' && первые два байта всегда 'BM'
? 'Это не BMP'
return
endif
lnOffset = ctobin(substr(lcHead, 11, 4), '4RS') && Номер байта с которого начинается сама картинка
lcHead = fread(lnFH, lnOffset - 14) && Остальной заголовок
lnWidth = ctobin(substr(lcHead, 5, 4), '4RS')
lnHeight = ctobin(substr(lcHead, 9, 4), '4RS')
? 'Размер:', lnWidth, lnHeight
for y = 1 to lnHeight
for x = 1 to lnWidth
lnR = asc(fread(lnFH, 1))
lnG = asc(fread(lnFH, 1))
lnB = asc(fread(lnFH, 1))
? "точка (", x, y, ") = RGB(", lnR, lnG, lnB, ")"
endfor
if (lnWidth * 3) % 4 != 0
fread(lnFH, (lnWidth * 3) % 4) && Пропускаем мусор для выравнивания до 4-х байт
endif
endfor
fclose(lnFH)
Пример преобразования из одного формата BMP в другой, обратите внимание на дописывание мусора в файл:
FAT_FS вход в директорию
- Информация о материале
- Автор: Super User
- Родительская категория: Заметки
- Категория: Программирование микроконтроллеров
- Просмотров: 2777
res = f_mount(&fs,"0:",1);
res = f_opendir(&dir, "0:4");
if (res == FR_OK)
{
while (((res = f_readdir(&dir, &fileInfo)) == FR_OK) && fileInfo.fname[0])
{
nFiles++;
}
}
f_closedir(&dir);
17.05.16 Московская область. Атмосферное давление растёт. Ожидаем тёплую погоду
- Информация о материале
- Автор: Super User
- Родительская категория: Погода
- Категория: Альтернативная погода от wow-only.ru
- Просмотров: 2400
Давление снова снижается. Ожидаем дожди и прохладу.
Поворот точки и полигона относительно другой точки Си. Point and polygon rotation around the origin C code
- Информация о материале
- Автор: Super User
- Родительская категория: Заметки
- Категория: Программирование
- Просмотров: 3378
typedef struct
{
int16_t X;
int16_t Y;
}Point, * pPoint;
Точка:
Point RotatePoint(Point Coord, Point Coord0, float32_t angle){ //angle max is 2pi rad
static float32_t cosV;
static float32_t sinV;
static float32_t Xo;
static float32_t Yo;
static float32_t X;
static float32_t Y;
// angle*= 0.017453292f;
cosV = arm_cos_f32(angle);
sinV = arm_sin_f32(angle);
X = (float32_t)Coord.X;
Y = (float32_t)Coord.Y;
Xo = (float32_t)Coord0.X;
Yo = (float32_t)Coord0.Y;
Coord.X = (uint16_t)(Xo + (((X - Xo)*cosV)) + (((Yo - Y)*sinV))+0.5);
Coord.Y = (uint16_t)(Yo + (((X - Xo)*sinV)) + (((Y - Yo)*cosV))+0.5);
return Coord;
}
Полигон поворот положительные градусы = по часовой стрелке (координата Y - сверху вниз, X - слева направо) в (0.001 * angle_deg) градусах:
void RotatePoly(Point* pToPoints, uint8_t NumbOfPoints, const pPoint Origin, int32_t angle_deg){
int i;
float32_t angle = 1.7453292e-5 * (float32_t)angle_deg;
for(i = 0; i < NumbOfPoints; i++){
pToPoints[i] = RotatePoint(pToPoints[i], *Origin, angle);
}
}
Фильмы для сознания: права животных
- Информация о материале
- Автор: Super User
- Родительская категория: Заметки
- Категория: Биотехнологии
- Просмотров: 2870
Страница 154 из 197
