Я потратил, вероятно, слишком много часов на поиск учебников по обработке изображений (БЕЗ использования внешних библиотек) без реального успеха. Если кто-нибудь знает какие-нибудь хорошие учебники, которые можно найти, которые могут помочь в этом, я бы очень признателен.
Я новичок в кодировании (это мой первый год в колледже), и задание, которое просит наш профессор, требует оригинального кода для преобразования 24-битных растровых изображений.
Я нашел вопрос в StackExchange, который показывает вращение изображения без использования внешних библиотек:
Используя этот код (с проектом стартера мы получили, и мне пришлось опираться), я смог создать этот код:
Байт определяется как typedef символов без знака.
void BMPImage::RotateImage()
{
vector<byte> newBMP(m_BIH.biWidth * m_BIH.biHeight);
long newHeight = m_BIH.biWidth; /* Preserving the original width */
m_BIH.biWidth = m_BIH.biHeight; /* Setting the width as the height*/
m_BIH.biHeight = newHeight; /* Using the value of the original width, we set it as the new height */
for (int r = 0; r < m_BIH.biHeight; r++)
{
for (int c = 0; c < m_BIH.biWidth; c++)
{
long y = c + (r*m_BIH.biHeight);
long x = c + (r*m_BIH.biWidth - r - 1) + (m_BIH.biHeight*c);
newBMP[y] = m_ImageData[x];
}
}
m_ImageData = newBMP;
}
Этот код не показывает красных squigglies, но когда я пытаюсь выполнить поворот, я получаю всплывающее окно с сообщением об ошибке вне контекста. Я использовал векторы только в одном задании, поэтому я не знаю, где проблема. Помоги пожалуйста!
Я думаю, что проблема может быть здесь:
m_ImageData = newBMP;
Предположим, что ваш newBMP имеет ширину = 1 и height = 2, затем
vector<byte> newBMP(m_BIH.biWidth * m_BIH.biHeight);
будет массив размером 2 с действующим indexrange [0 1]. Расчет индекса
long y = c + (r*m_BIH.biHeight);
будет 2 при c = 0 и r = 1. Но 2 не является допустимым индексом для вашего вектора и с
newBMP[y] = ...
вы получаете доступ к элементу, который не является частью вектора. Для этого примера ваш индекс x будет -1.
long y = (c + (r*m_BIH.biHeight)) -1
?