图片处理(Picture Lab)活动8:创建图片剪辑

陈 欣发布

你可以通过逐像素复制来将一张图片复制到另一张上。这么做的话,你需要同时追踪原图和目标图的行号和列号信息,如同以下copy method所展示的一样。最简单的做法是在外层循环中同时声明并初始化fromRowtoRow,并在每轮循环后同时增加它们。对于for循环而言,可以声明并修改一个以上变量,用,分隔开即可。同理,内层循环也对fromColtoCol做了类似的处理。

public void copy(Picture fromPic, 
               int startRow, int startCol)
{
  Pixel fromPixel = null;
  Pixel toPixel = null;
  Pixel[][] toPixels = this.getPixels2D();
  Pixel[][] fromPixels = fromPic.getPixels2D();
  for (int fromRow = 0, toRow = startRow; 
       fromRow < fromPixels.length &&
       toRow < toPixels.length; 
       fromRow++, toRow++)
  {
    for (int fromCol = 0, toCol = startCol; 
         fromCol < fromPixels[0].length &&
         toCol < toPixels[0].length;  
         fromCol++, toCol++)
    {
      fromPixel = fromPixels[fromRow][fromCol];
      toPixel = toPixels[toRow][toCol];
      toPixel.setColor(fromPixel.getColor());
    }
  }   
}

可以通过将几张小图片复制到一张大图片中来创建图片剪辑。在复制之前甚至还可以对图片做清零蓝色之类的操作。之后你还能将剪辑镜像以得到不错的视觉效果。

以下method展示了如何使用copy method来创建图片剪辑。

public void createCollage()
{
  Picture flower1 = new Picture("flower1.jpg");
  Picture flower2 = new Picture("flower2.jpg");
  this.copy(flower1,0,0);
  this.copy(flower2,100,0);
  this.copy(flower1,200,0);
  Picture flowerNoBlue = new Picture(flower2);
  flowerNoBlue.zeroBlue();
  this.copy(flowerNoBlue,300,0);
  this.copy(flower1,400,0);
  this.copy(flower2,500,0);
  this.mirrorVertical();
  this.write("collage.jpg");
}

注意Picturewrite方法可以被用来将最终的剪辑结果以JPEG图片文件的形式保存到硬盘中。你可以使用完整的路径名来作为保存地址(c:\temp\collage.jpg)。务必不要忘记.jpg的扩展名,让电脑能够正确识别文件格式。

可以用PictureTester中的testCollage method来测试它。

练习

  1. 编写另一个copy method,增加额外的参数让你可以仅复制fromPic的一部分。你需要增加参数以描述复制的开始行、结束行、开始列和结束列。在class PictureTester中创建一个测试新method的static method,并确保在PictureTestermain method中调用它。
  2. 编写myCollage method,让三幅图片(可以是同一张)在经过三种不同的图像操作和至少一次镜像之后复制三次。在class PictureTester中创建一个测试新method的static method,并确保在PictureTestermain method中调用它。

陈 欣

AADPS创始人

0 条评论

发表回复