Форум программистов, компьютерный форум CyberForum.ru

Выравнивающие биты в BMP - C++

Восстановить пароль Регистрация
 
laker
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 2
01.09.2013, 21:55     Выравнивающие биты в BMP #1
Здравствуйте.

Прошу помощи, не могу найти ошибку в коде. Задача обработать взвешенным ранговым фильтром бмп файл и результат переписать в другой бмп. Сам фильтр реализован верно, подозреваю что проблема с выравнивающими битами.

C++
1
2
3
4
5
6
7
8
9
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
void rangeFilter(BYTE *in,BYTE * out,int w,int h)
{
    
    int k;
    cout<<"  k= ";  
    k=3;//cin>>k; //k параметр рангового фильтра
    cout<<endl;
 
    DWORD matrixDim=3;//getMatrixSize("Enter matrix size ( Number >=3) "); 
    DWORD * matrix = new DWORD [matrixDim * matrixDim]; //матрица апертуры
    DWORD *mPtr=matrix;
    cout<<"Enter aperture elements:"<<endl;
 
    DWORD apertureArraySize=0; //размер апертурного массива для сортировки
    for (DWORD _i =0; _i<matrixDim*matrixDim; )//ввод матрицы
    {
        //cin>>*mPtr;
        *mPtr=1;
        if ((_i++ % matrixDim)==0)       cout<<endl;
 
        if (*mPtr<0)
        {
            cout<<"The number must be >=0"<<endl;
            --_i;
            continue;
        }
        apertureArraySize+=*mPtr;
        mPtr++;     
    }
    if (apertureArraySize==0)
    {
        delete []matrix;
        return;
    }
 
    BYTE * apertureRow=new BYTE[apertureArraySize];
    DWORD halfDim=matrixDim/2;
    DWORD wsize=(halfDim*2+1)*(halfDim*2+1);    
    int nuli=0;
        if ((3*w)%4!=0) nuli=4-(3*w)%4;
 
    for (unsigned y = 0; y < h; ++y)
    {
        for (unsigned x = 0; x < w; ++x)
        {
            if ((y<halfDim)||(y>=(h-halfDim))||(x<halfDim)||(x>=(w-halfDim)))//обработка краев
                continue;
 
            //Обегаем соседние точки и заполняем апертурный ряд
            BYTE * _apertureRow=apertureRow;            
            mPtr=matrix;
            for (int _y=y-halfDim;_y<=y+halfDim;_y++)
            {
                for (int _x=x-halfDim;_x<=x+halfDim;_x++)
                {                   
                    for (unsigned int i=*mPtr;i>0;i--)//заполнение массива без сортировки                   
                        *_apertureRow++=in[(_y) * w + (_x)];
                    
                    mPtr++;
                }
            }
            
            qsort ((void*)(apertureRow), apertureArraySize, sizeof(unsigned char),
                compareUchar); //сортируем апертурный массив
 
            if (abs(apertureRow[k+1]-in[y*w+x]) < (abs(apertureRow[wsize-k]-in[y*w+x])))//
                out[y*(w+nuli)+x]=apertureRow[k+1];
            else
                out[y*(w+nuli)+x]=(apertureRow[wsize-k]);
        }
 
        
    
        for(int i=1;i<=nuli;i++)  out[y*(w+nuli)+w+i]=0;
        
        //for(int i=0;i<=(w+nuli);i++) cout<<i;
        cout<<(w+nuli)<<endl;
        for(int i=0;i<=(w+nuli);i++)  cout<<out[y*w+i];
        cout<<endl;
    }
    delete [] apertureRow;
    delete [] matrix;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2013, 21:55     Выравнивающие биты в BMP
Посмотрите здесь:

биты C++
C++ Шумящие биты в WAV
Задача на биты. C++
... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ... C++
C++ Работа с BMP-файлами (класс "8 битное BMP изображение)
C++ Инвентировать биты в байте
C++ Задача про биты
C++ Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
02.09.2013, 13:00     Выравнивающие биты в BMP #2
Цитата Сообщение от laker Посмотреть сообщение
проблема с выравнивающими битами
число байт в строке файла должно быть кратно 4. если это не так, то строка дополняется до нужного размера байтами которые при считывании должны быть пропущены. проверьте есть ли этот момент у вас в коде
Yandex
Объявления
02.09.2013, 13:00     Выравнивающие биты в BMP
Ответ Создать тему
Опции темы

Текущее время: 18:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru