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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
laker
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 2
#1

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

01.09.2013, 21:55. Просмотров 582. Ответов 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++):

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат - C++
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат.

... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ... - C++
Доброго времени суток всем, столкнулся с проблемой по С++,требуется написать программу: которая получает 1)случайное целое типа int,...

Работа с BMP-файлами (класс "8 битное BMP изображение) - C++
Написать класс &quot;8 битное BMP изображение&quot;.Класс должен содержать 3 конструктора: конструктор по умолчанию, конструктор с параметрами и...

биты - C++
помогите пожалуйста написать программу которая переведет натуральное число в двоичною систему исчесления и выведет на экран

Задача на биты. - C++
Здраствуйте. С++ начал изучать недавно. И возникла проблема с решением задачи на биты. Вот собственно сама задача. Пока я выучил только...

Шумящие биты в WAV - C++
Вот такой вопросик как писать программу для сохранения собственного сообщение в звуковом файле расширения .WAV программа должна...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3157 / 1959 / 218
Регистрация: 13.01.2012
Сообщений: 7,496
02.09.2013, 13:00 #2
Цитата Сообщение от laker Посмотреть сообщение
проблема с выравнивающими битами
число байт в строке файла должно быть кратно 4. если это не так, то строка дополняется до нужного размера байтами которые при считывании должны быть пропущены. проверьте есть ли этот момент у вас в коде
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2013, 13:00
Привет! Вот еще темы с ответами:

Поменять местами биты - C++
Добрый вечер, такой вопрос: имеется массив из 10 чисел, их нужно перевести из десятичного представления в двоичное, найти максимум и если в...

Инвентировать биты в байте - C++
Народ помогите пожалуйста как инвентировать биты в байте

Задача про биты - C++
Написать функцию, которая возвращает число, полученное из числа X,в котором все розряды, расположенные правее центральной позиции, заменены...

Байт в биты в файле - C++
Нашёл такую реализацию(вроде бы реализацию, я сам не знаю как она работает) превращения байта символа в биты. Но не могу понять, как собой...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru