图片处理(Picture Lab)活动8:创建图片剪辑
你可以通过逐像素复制来将一张图片复制到另一张上。这么做的话,你需要同时追踪原图和目标图的行号和列号信息,如同以下copy method所展示的一样。最简单的做法是在外层循环中同时声明并初始化fromRow与toRow,并在每轮循环后同时增加它们。对于for循环而言,可以声明并修改一个以上变量,用,分隔开即可。同理,内层循环也对fromCol和toCol做了类似的处理。
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");
}
注意Picture的write方法可以被用来将最终的剪辑结果以JPEG图片文件的形式保存到硬盘中。你可以使用完整的路径名来作为保存地址(c:\temp\collage.jpg)。务必不要忘记.jpg的扩展名,让电脑能够正确识别文件格式。
可以用PictureTester中的testCollage method来测试它。
练习
- 编写另一个
copymethod,增加额外的参数让你可以仅复制fromPic的一部分。你需要增加参数以描述复制的开始行、结束行、开始列和结束列。在class PictureTester中创建一个测试新method的staticmethod,并确保在PictureTester的mainmethod中调用它。 - 编写
myCollagemethod,让三幅图片(可以是同一张)在经过三种不同的图像操作和至少一次镜像之后复制三次。在class PictureTester中创建一个测试新method的staticmethod,并确保在PictureTester的mainmethod中调用它。
0 条评论