图像处理(矢量下标超出范围)

时间:2014-02-20 17:53:32

标签: c++ visual-studio

我花了太多时间寻找有关图像处理的教程(没有使用外部库)但没有取得真正的成功。如果有人知道可以找到任何可以帮助这种方式的好教程,我真的很感激。

我对编码很新(这是我上大学的第一年),我们教授要求的任务需要原始代码来转换24位位图图像。

我在StackExchange中发现了一个问题,它显示了图像的旋转而不使用外部库:

My code rotates a bmp picture correctly but only if the number of pixels is a muliple of 4... can anyone see whats wrong?

使用此代码(我们获得了初学者项目,我必须构建),我能够创建此代码:

字节被定义为unsigned chars的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;
}

此代码没有显示任何红色波浪形,但是当我尝试执行旋转时,我得到一个向量下标超出范围错误消息弹出窗口。我以前只在一个作业中使用过向量,所以我不知道问题出在哪里。求救!

我认为问题可能在这里:

m_ImageData = newBMP;

1 个答案:

答案 0 :(得分:0)

假设你的newBMP宽度= 1,高度= 2然后

vector<byte> newBMP(m_BIH.biWidth * m_BIH.biHeight);

将是具有有效索引范围[0 1]的大小为2的数组。你的指数计算

long y = c + (r*m_BIH.biHeight);
对于c = 0和r = 1,

为2。但是2不是矢量的有效索引,而且

newBMP[y] = ...

您访问的元素不属于矢量。对于此示例,您的索引x将为-1。