使用2D数组裁剪图像?

时间:2014-03-16 18:44:37

标签: arrays image 2d crop pgm

我完全失去了这项任务,任何帮助都会受到赞赏!我正在阅读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;
}

有什么建议吗?

1 个答案:

答案 0 :(得分: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)开始插入。添加像素后,目标变量就会更新。

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

希望这有帮助,

hnefatl