我花了太多时间寻找有关图像处理的教程(没有使用外部库)但没有取得真正的成功。如果有人知道可以找到任何可以帮助这种方式的好教程,我真的很感激。
我对编码很新(这是我上大学的第一年),我们教授要求的任务需要原始代码来转换24位位图图像。
我在StackExchange中发现了一个问题,它显示了图像的旋转而不使用外部库:
使用此代码(我们获得了初学者项目,我必须构建),我能够创建此代码:
字节被定义为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;
答案 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。