如何使用RGB数组在Java中扩展PPM映像

如何使用RGB数组在Java中扩展PPM映像,java,arrays,image,netbeans,ppm,Java,Arrays,Image,Netbeans,Ppm,我正在从事一个java项目(创建我自己的图像编辑器),我的任务是允许用户将现有PPM图像的大小增加一倍。我必须通过使用RGB的二维阵列来实现这一点。我的指导老师给了我一个提示,我必须创建一个宽度和高度都是第一个图像的两倍的新图像,并创建新的数组来填充它。我相信我做得对。但是,当我运行程序并单击界面上的“加倍大小”按钮时,我的原始图像的大小会加倍,但它会变成完全黑色。我认为如何转换RGB值存在问题。我插入了打印语句以查看代码何时出错(当我的RGB值变为零时) 好的,我已经分别尝试了以下代码,在我的

我正在从事一个java项目(创建我自己的图像编辑器),我的任务是允许用户将现有PPM图像的大小增加一倍。我必须通过使用RGB的二维阵列来实现这一点。我的指导老师给了我一个提示,我必须创建一个宽度和高度都是第一个图像的两倍的新图像,并创建新的数组来填充它。我相信我做得对。但是,当我运行程序并单击界面上的“加倍大小”按钮时,我的原始图像的大小会加倍,但它会变成完全黑色。我认为如何转换RGB值存在问题。我插入了打印语句以查看代码何时出错(当我的RGB值变为零时)

好的,我已经分别尝试了以下代码,在我的嵌套for循环中,,我收到了每个代码的ArrayOutOfBounds异常。我的理解是,如果我在(5,3)处有一个像素,我想将其加倍,我需要将其转置,并在宽度和高度上加倍,占据4个位置。(10,6)左上(10,7)右上,(11,6)左下,(11,7)右下。所以我需要对每个rg和b分配4个赋值语句,对吗

IDK 我尝试了以下四种方法作为嵌套for循环的内容,但没有任何运气

              //1st try


             doubleMyRedPixels[i][j]=gimmieRed[i/2][j/2];
             doubleMyGreenPixels[i ][j]=gimmieGreen[i/2][j/2];
             doubleMyBluePixels[i ][j]=gimmieBlue[i/2][j/2];

              //2nd try
              doubleMyRedPixels[i][j]=gimmieRed[i/2][j/2];
              doubleMyRedPixels[i][j]=gimmieRed[i / 2][(j / 2) - 1];
              doubleMyRedPixels[i][j]=gimmieRed[(i / 2) - 1][j /2];
              doubleMyRedPixels[i][j]=gimmieRed[(i / 2) - 1][(j /2) - 1];

              doubleMyGreenPixels[i ][j]=gimmieGreen[i/2][j/2];
              doubleMyGreenPixels[i][j]=gimmieGreen[i / 2][(j / 2) - 1];
              doubleMyGreenPixels[i][j]=gimmieGreen[(i / 2) -1][j / 2];
              doubleMyGreenPixels[i][j]=gimmieGreen[(i / 2) -1][(j / 2) - 1];

              doubleMyBluePixels[i ][j]=gimmieBlue[i/2][j/2];
              doubleMyBluePixels[i][j]=gimmieBlue[i /2][(j / 2) - 1];
              doubleMyBluePixels[i][j]=gimmieBlue[(i / 2) - 1][j / 2];
              doubleMyBluePixels[i][j]=gimmieBlue[(i / 2) -1][(j / 2) - 1];*/
              //3rd try
              doubleMyRedPixels[i ][j]=gimmieRed[i*2][j*2];
              doubleMyRedPixels[i][j]=gimmieRed[i * 2][(j * 2) + 1];
              doubleMyRedPixels[i][j]=gimmieRed[(i * 2) + 1][j * 2];
              doubleMyRedPixels[i][j]=gimmieRed[(i * 2) + 1][(j * 2) + 1];

              doubleMyGreenPixels[i ][j]=gimmieGreen[i*2][j*2];
              doubleMyGreenPixels[i][j]=gimmieGreen[i * 2][(j * 2) + 1];
              doubleMyGreenPixels[i][j]=gimmieGreen[(i * 2) + 1][j * 2];
              doubleMyGreenPixels[i][j]=gimmieGreen[(i * 2) + 1][(j * 2) + 1];

              doubleMyBluePixels[i ][j]=gimmieBlue[i*2][j*2];
              doubleMyBluePixels[i][j]=gimmieBlue[i * 2][(j * 2) + 1];
              doubleMyBluePixels[i][j]=gimmieBlue[(i * 2) + 1][j * 2];
              doubleMyBluePixels[i][j]=gimmieBlue[(i * 2) + 1][(j * 2) + 1];

              //4th try
              doubleMyRedPixels[i * 2][j * 2]=gimmieRed[i][j];
              doubleMyRedPixels[i * 2][(j * 2) + 1]= gimmieRed[i][j];
              doubleMyRedPixels[(i * 2) + 1][j * 2]= gimmieRed[i][j];
              doubleMyRedPixels[(i * 2) + 1][(j * 2) + 1]= gimmieRed[i][j];

              doubleMyGreenPixels[i * 2][j * 2]=gimmieGreen[i][j];
              doubleMyGreenPixels[i * 2][(j * 2) + 1]= gimmieGreen[i][j];
              doubleMyGreenPixels[(i * 2) + 1][j * 2]= gimmieGreen[i][j];
              doubleMyGreenPixels[(i * 2) + 1][(j * 2) + 1]= gimmieGreen[i][j];

              doubleMyBluePixels[i * 2][j * 2]=gimmieBlue[i][j];
              doubleMyBluePixels[i * 2][(j * 2) + 1]= gimmieBlue[i][j];
              doubleMyBluePixels[(i * 2) + 1][j * 2]= gimmieBlue[i][j];
              doubleMyBluePixels[(i * 2) + 1][(j * 2) + 1]= gimmieBlue[i][j];
好的,我想我明白了

我的新2D int数组应该像这样初始化

        int[][] doubleMyRedPixels = new int[gimmieRed.length * 2][gimmieRed[0].length * 2];
        int[][] doubleMyBluePixels = new int[gimmieBlue.length * 2][gimmieBlue [0].length * 2];
        int[][] doubleMyGreenPixels = new int[gimmieGreen.length * 2][gimmieGreen[0].length * 2];
我的for循环应该如下所示

    for (int i = 0; i < longer; i++) {
        for (int j = 0; **j** < wider; j++) {
for(int i=0;i

前面提到的1st try允许我将任何ppm图像的大小加倍!

在右侧将索引除以2,而不是在左侧乘以2。例如doubleMyRedPixels[i][j]=gimmieRed[i/2][j/2]并将新的PPMImage代码移到for循环结束后,而不是for循环内。@WillShackleford感谢您的快速响应!我基本上按照您所说的方式解开了操作并将其放在左侧。我还将“新图像”放在左侧代码在for循环之外,但现在我得到了一个数组越界异常。图像甚至不会再加倍。它也不会变黑…@我的for循环的内部看起来是这样的:doubleMyGreenPixels[i][j]=gimmieGreen[i/2][j/2];doubleMyGreenPixels[i][j]=gimmieGreen[i/2][(j/2)-1];doubleMyGreenPixels[i][j]=框架绿[(i/2)-1][j/2];doubleMyGreenPixels[i][j]=框架绿[(i/2)-1][(j/2)-1];编辑原始问题比在注释中添加代码更好。这样可以正确格式化。不需要在索引中添加任何带-1的行。只使用第一行。@Will。我的理解是,如果在(5,3)处有一个像素我想把它翻一番,我需要把它的宽度和高度都翻一番,占据4个位置。(10,6)左上(10,7)右上,(11,6)左下,(11,7)右下。所以我需要每个RG和b的4个赋值语句?这次我用不同的尝试更新了这个问题。它们似乎都不起作用。
        int[][] doubleMyRedPixels = new int[gimmieRed.length * 2][gimmieRed[0].length * 2];
        int[][] doubleMyBluePixels = new int[gimmieBlue.length * 2][gimmieBlue [0].length * 2];
        int[][] doubleMyGreenPixels = new int[gimmieGreen.length * 2][gimmieGreen[0].length * 2];
    for (int i = 0; i < longer; i++) {
        for (int j = 0; **j** < wider; j++) {