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

Изменение размера bmp стандартными средствами c++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Уменьшить число коллизий хеш-таблицы http://www.cyberforum.ru/cpp-beginners/thread975886.html
Задание: хеш-таблица с мультипликативной хеширующей функцией (метод умножения) и решением коллизий внутренними (срастающимися) цепочками. вот, что у меня получилось #include <iostream> #include <stdlib.h> #include <stdio.h> #define table_items 17 // число элементов таблицы #define M 32 // размер таблицы
C++ Замена кода символа на его значение Здравствуйте, есть строка string url = "&laquo;Открой меня!&trade;&raquo;"; как можно заменить коды символов на их значения? http://www.cyberforum.ru/cpp-beginners/thread975883.html
C++ Не могу разобраться с алгоритмом
Проанализируйте блок-схему алгоритма на рис.5. Определите, какое сообщение необходимо выводить вместо ??? На входе алгоритма: вводится последовательность чисел, 0 - конец последовательности, x0 - текущий член последовательности, x1 - следующий член последовательности.
C++ По поводу расширения окна
Здравствуйте, очень хочу узнать. Как в играх делают окно игры на весь экран? И возможно ли это в простых формах. Допустим при запуске формы, форма полностью занимала размер твоего экрана. Не так чтоб ее можно было растянуть, а полностью. Чтоб ни пуска не было видно ничего.
C++ Заполнить массив случайными символами http://www.cyberforum.ru/cpp-beginners/thread975861.html
Нужно заполнить массив случайными символами(буквами и числами). Как это можно сделать с помощью rand?
C++ Дана целочисленная матрица A (N,M), в которой имеются ровно два одинаковых элемента. Найти индексы этих элементов Дана целочисленная матрица A (N,M), в которой имеются ровно два одинаковых элемента. Найти индексы этих элементов. Написал такую хрень, но она мне не нравится, слишком все как то запутано, попроще нельзя? #include <iostream> #include <cstdlib> #include <clocale> #include <ctime> using namespace std; подробнее

Показать сообщение отдельно
Vespertilio
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 14

Изменение размера bmp стандартными средствами c++ - C++

13.10.2013, 01:31. Просмотров 670. Ответов 2
Метки (Все метки)

Доброго времени суток, форумчане. Интересует такой вопрос: есть изображение bmp с глубиной 24 бита. Требуется провести децимацию: вырезать чётные строки и столбцы и сохранить в новом файле.

Проблема в непосредственном создании изображения, ширина и высота которого меньше исходной в два раза.

Выдержки из кода:

C++
1
2
3
4
[RGBTRIPLE* dstRgb = (RGBTRIPLE*)calloc(1, area * sizeof(RGBTRIPLE) / (step * step)); 
// Здесь area - площадь исходной картинки, step - шаг "вырезания"
//(в данном примере пусть step = 2, то есть высота и ширина урезаются в два раза, соответственно
//площадь картинки таким образом уменьшается вчетверо)
Этим шагом выделяю массив под новую картинку. НО при использовании такого кода:
C++
1
2
3
4
5
6
7
8
9
10
 
for(int i = 0; i < bih.biHeight; i += step){ //bih - структура типа bitmapinfoheader
    for(int j = 0; j < bih.biWidth; j += step){
                //Здесь rgb - массив триплетов из исходной картинки
        dstRgb[(i * bih.biWidth + j)/2].rgbtBlue = rgb[i * bih.biWidth + j].rgbtBlue;//Нижеописанное исключение бросается на этой строчке
        dstRgb[(i * bih.biWidth + j)/2].rgbtRed = rgb[i * bih.biWidth + j].rgbtRed;
        dstRgb[(i * bih.biWidth + j)/2].rgbtGreen = rgb[i * bih.biWidth + j].rgbtGreen;     
    }
}
free(rgb);
при исполнении программы выдаёт вот такое исключение:
C++
1
Необработанное исключение в "0x013a1dec" в "MMTL1.exe": 0xC0000005: Нарушение прав доступа при записи "0x038dab40".
Если вместо вышеуказанного выделения памяти под новую картинку использовать вот такое:
C++
1
RGBTRIPLE* dstRgb = (RGBTRIPLE*)calloc(1, area * sizeof(RGBTRIPLE));
, то есть, без уменьшения площади, то, в принципе, программа работает - на выходе получается картинка, у которой в левой нижней четверти уменьшенное в четыре раза исходное изображение, остальные три четверти черны. При изменении свойств bih.biWidth и bih.biHeight напрямую картинка ведёт себя тоже не так, как задумывалось. Вопрос: почему может появляться такое исключение и как вести себя при решении подобных задач с изменением размера (как в большую, так и в меньшую стороны с использованием только стандартных средств C++)?

Вот весь код функции, если он будет необходим:
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
//src, dst - названия исходного и конечного файлов, step - шаг децимации,
//way - несущественная для данного вопроса переменная
void decimation(char* src, char* dst, int step, int way){
    FILE* imgFile = fopen(src, "rb");
    BITMAPFILEHEADER bfh;
    fread(&bfh, sizeof(bfh), 1, imgFile);
    
    BITMAPINFOHEADER bih;
    fread(&bih, sizeof(bih), 1, imgFile);
 
    int imgSize = bih.biSizeImage;
 
    int area = bih.biWidth * bih.biHeight;
 
    RGBTRIPLE* rgb = (RGBTRIPLE*)calloc(1, imgSize);
    fread(rgb, imgSize, 1, imgFile);
 
    fclose(imgFile);
    
    RGBTRIPLE* dstRgb = (RGBTRIPLE*)calloc(1, area * sizeof(RGBTRIPLE));//Проблемное место номер один
 
    if(way){
        for(int i = 0; i < bih.biHeight; i += step){
            for(int j = 0; j < bih.biWidth; j += step){
                dstRgb[(i * bih.biWidth + j)/2].rgbtBlue = rgb[i * bih.biWidth + j].rgbtBlue;//Исключение бросается на этой строчке
                dstRgb[(i * bih.biWidth + j)/2].rgbtRed = rgb[i * bih.biWidth + j].rgbtRed;
                dstRgb[(i * bih.biWidth + j)/2].rgbtGreen = rgb[i * bih.biWidth + j].rgbtGreen;     
            }
        }
        free(rgb);
    }
    writeBmp(dst, bfh, bih, dstRgb);//Функция записи в файл
    free(dstRgb);
}
Заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru