这不会分段错误,但它不会读取“原始”文件的像素。
Image Image::scaleUp(int numTimes) const
{
Image newImage(width*numTimes, height*numTimes);
newImage.createImage(width*numTimes, height*numTimes);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
for(int inner_x = 0; inner_x < numTimes; inner_x++){
for (int inner_y = 0; inner_y < numTimes; inner_y++){
newImage.pixelData[x*numTimes+inner_x][y*numTimes+inner_y] = pixelData[x][y];
}
}
}
}
return newImage;
}
现在解决*(*除了我的图像以黑白形式出现)
答案 0 :(得分:1)
您的代码似乎使颜色更亮(将它们乘以numTimes
)。这是你想要做的吗?
如果要返回图像的副本,则应在应用转换之前复制,然后返回对该图像的引用。也许你的Image类已经有了一个可以用来获取副本的拷贝构造函数(如果没有,你将不得不添加它或者有另一种构造对象的方法)。
我认为这就是你想要的:
Image Image::scaleUp(int numTimes) const
{
Image newImage = new Image(); // You might have a constructor to specify size so data is pre-allocated ?
// Your copy-and-scale code, but set data in newImage ....
// Using copyAll here should be avoided, since it is just copying data
// that you will need to set again when doing the scaling.
return newImage;
}
答案 1 :(得分:0)
C ++中的所有方法都有一个指向名为this
的当前对象的指针。您可以使用以下命令返回对象的引用:
// Note that we're now returning a reference with Image&
const Image& Image::scaleUp(int numTimes) const
{
// ...
return *this;
}
答案 2 :(得分:0)
好的,所以我认为你要做的是应用对比度滤镜(将每个像素乘以一个值)。如果你想要一个亮度算法,而不是乘法,只需求和。在基本的方法上,只要你阅读每个像素就是:
float contrast = 1.10; //Apply 10% contrast
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++)
{
int temp = pixelData[x][y] * contrast;
temp = temp > 255 ? 255 : temp; //it is always good to check if the result is in the range 0..255
pixelData[x][y] = temp;
}
}
在上面的代码中,我正在使用原始图像。将对每个像素执行这些步骤。我还假设每个通道(RGB)有8位像素(0..255)。
我还假设x(列)指向RGB空间的一个元素,比如R,而x + 1指向G,x + 2指向B.这是所有像素通道都相邻的情况记忆