放大图像

时间:2010-04-15 20:54:11

标签: c++

这不会分段错误,但它不会读取“原始”文件的像素。

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;
}

现在解决*(*除了我的图像以黑白形式出现)

3 个答案:

答案 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.这是所有像素通道都相邻的情况记忆