0

我完全迷失了这个任务,任何帮助将不胜感激!我正在阅读 PGM 图像并对其进行更改。我已经写了一些代码来增加它的亮度,但我不知道如何裁剪它。

我的示例代码:

public static short[][] brighten(short[][] orig, short amount) {

    short[][] returnArray = new short[orig.length][orig[0].length];
    for(int i = 0; i < orig.length; ++i){
        for(int j = 0; j < orig[0].length; ++j){
            returnArray[i][j] = (short)(orig[i][j]+amount);
        }

    }

    return returnArray;
}

所以我尝试使用这样的东西,但它似乎也不起作用:

public static short[][] crop(short[][] orig, int ULx, int ULy, int >LRx, int LRy) {

    short[][] returnArray = new short[orig.length][orig[0].length];
    for (int i = ULx; i <= LRx; i++) {
        for (int j = ULy; j <= LRy; j++){
            returnArray[i][j] = (short)(orig[i][j]);
        }
    }
    return returnArray;
}

有什么建议么?

4

1 回答 1

0

只需使用for像您的增亮示例中那样的嵌套循环,但只复制某些值:

  • 要从左侧裁剪,开始循环遍历要裁剪的值的行。
  • 要从右侧裁剪,从 0 开始循环,但将其限制为裁剪到的值。

相同的概念适用于垂直裁剪。

这是我修改后的代码——这次是用 Java 给你的 :)

    short[][] returnArray = new short[orig.length][orig[0].length];

    int ReturnArrayX=0, ReturnArrayY;
    for (int i = ULx; i <= LRx; i++)
    {
        ReturnArrayY=0;
        for (int j = ULy; j <= LRy; j++)
        {
            returnArray[ReturnArrayX][ReturnArrayY] = (short)(orig[i][j]);
            ReturnArrayY++;
        }
        ReturnArrayX++;
    }
    return returnArray;

这可能不是最有效的方法,但它可以完成并且很容易理解:)

基本上,您有两个变量遍历“像素”的原始数组,另外两个变量遍历这些变量的目的地 - 原始变量可能从 5 开始,从 5 个像素开始裁剪,但是有了这些新的 2 个变量,它们'将从结果数组中的 (0,0) 开始插入。一旦添加了一个像素,目标变量就会更新。

重要提示:再一次,您可能必须调整变量循环的顺序。我还没有测试过这段代码,所以我不知道它是如何工作的。理论是有的,但实际可能没有。让它运行,看看它是否旋转了图片 - 如果有,你需要切换两个变量。

希望这可以帮助,

内法特

于 2014-03-16T18:51:16.647 回答