Форум программистов, компьютерный форум 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
14.10.2013, 03:08  [ТС]     Изменение размера bmp стандартными средствами c++
MrGluck, по OpenCV, чувствую, тоже появятся вопросы в скорейшем будущем

А пока MS VisualStudio 2010 без OpenCV.

Насчёт библиотек однозначного ответа дать не могу, но описания задействованных структур лежат в заголовочном файле WinGDI.h

Добавлено через 6 минут
Вот все включаемые файлы:
C++
1
2
3
4
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <Windows.h>
Добавлено через 1 час 16 минут
В одной ошибке разобрался сам. Ошибся при работе с памятью. Вместо
C++
1
dstRgb[(i * bih.biWidth + j) / 2]
надо было
C++
1
dstRgb[(i * bih.biWidth + j) / (step * step)]
для того, чтобы правильно урезать изображение (учесть изменения И по ширине, И по высоте, отсюда step * step).


Проблема теперь в другом: на выходе получается 4-хкилобайтный файл, при открытии говорится, что он повреждён. Посему новый вопрос: чтобы правильно записать новый RGB-массив, какие записи нужно ОБЯЗАТЕЛЬНО поменять в BITMAPINFOHEADER и BITMAPFILEHEADER, кроме biWidth и biHeight, и нужно ли что-нибудь менять вообще, или мыслю не в том направлении?

Добавлено через 23 часа 46 минут
Разобрался сам. Проблема опять была в неправильном обращении к памяти. При обращении к элементу массива в цикле вместо
C++
1
dstRgb[(i * bih.biWidth + j) / (step * step)]
правильней было использовать
C++
1
dstRgb[i * bih.biWidth / (step * step) + j / step]
, так как в первом случае он в левую половину картинки в каждый пиксель два раза записывал новое значение пикселя. Теперь строки и столбцы обрабатываются немного по-разному.

Мораль: весомая часть ошибок в решении многих задач с помощью C++ устраняется очень внимательной и скрупулёзной работой с динамической памятью.

P.S.: ещё надо было поменять в заголовках изображения атрибуты ширин, высот и размеров на новые. Вот так:
C++
1
2
3
4
bih.biHeight = bih.biHeight / step;
bih.biWidth = bih.biWidth / step;
bih.biSizeImage = bih.biSizeImage / (step * step);
bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + area * sizeof(RGBTRIPLE) / (step * step);
Может, кому пригодится
 
Текущее время: 21:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru