Обработка изображений (векторный индекс вне диапазона)

0

Я потратил, вероятно, слишком много часов на поиск учебников по обработке изображений (БЕЗ использования внешних библиотек) без реального успеха. Если кто-нибудь знает какие-нибудь хорошие учебники, которые можно найти, которые могут помочь в этом, я бы очень признателен.

Я новичок в кодировании (это мой первый год в колледже), и задание, которое просит наш профессор, требует оригинального кода для преобразования 24-битных растровых изображений.

Я нашел вопрос в StackExchange, который показывает вращение изображения без использования внешних библиотек:

Мой код правильно поворачивает изображение bmp, но только если количество пикселей - это мультика 4... может ли кто-нибудь увидеть, что случилось?

Используя этот код (с проектом стартера мы получили, и мне пришлось опираться), я смог создать этот код:

Байт определяется как 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;
Теги:
visual-studio

1 ответ

0

Предположим, что ваш 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.

  • 0
    Итак ... я хотел бы, чтобы -1 последнее число учитывало, что первый элемент равен 0 вместо 1, а размер вектора на самом деле кажется на единицу меньше, потому что он начинается с 0 ... Тогда ... long y = (c + (r*m_BIH.biHeight)) -1 ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню