【发布时间】:2015-03-04 22:02:17
【问题描述】:
我正在制作一个小型照片程序,它采用 .ppm 文件,然后应用过滤器,例如否定红色、绿色、蓝色、水平翻转和灰度(用户选择要应用的过滤器)。除了水平翻转有困难之外,我想通了一切。我认为没有必要发布整个程序,因为我只是在制作一项功能时遇到困难。但是,如果需要,请告诉我,然后我会发布。
以下是否定红色、绿色和蓝色的示例函数。
void negate_red(int image[], int w, int h)
{
for(int i = 0; i<h; i++)
for(int j=0; j<w; j++)
{
image[(i*w+j)*3] = 255 - image[(i*w+j)*3];
}
}
void negate_green(int image[], int w, int h)
{
for(int i = 0; i<h; i++)
for(int j=0; j<w; j++)
{
image[(i*w+j)*3+1] = 255 - image[(i*w+j)*3+1];
}
}
void negate_blue(int image[], int w, int h)
{
for(int i = 0; i<h; i++)
for(int j=0; j<w; j++)
{
image[(i*w+j)*3+2] = 255 - image[(i*w+j)*3+2];
}
}
据我了解,为了水平翻转图像,您必须颠倒数组的顺序。例如,第一个 RGB 值将是最后一个,对吗?有没有办法颠倒数组的顺序?在我问这个问题之前我做了一些搜索,我发现了这个: Correct flip/mirror of pixels of an image?
所以如果我解释正确,我应该像这样启动函数:
void flip (int image[], int w, int h)
{
for(int i = 0; i<h/2; i++)
for(int j=0; j<w/2; j++)
{
//code
}
}
现在有没有办法颠倒数组的顺序,让它从最后一个元素开始,到第一个?
感谢您的帮助,非常感谢!谢谢!
【问题讨论】:
-
是的,有办法。
-
@Almo Epic 答案。只是史诗。
-
我需要在这里澄清一下。你是如何阅读图像的?您是否一次读取 4 个字节,将单个 RGB 三元组读取为一个整数?还是您将 R 读入一个
int,将 G 读入下一个int并将 B 读入最后一个int?
标签: c++