Java-1483字节
我不是一个出色的打高尔夫球的人,请说清楚。因此冗长不完全是Java的错;-)尽管如此,这似乎是一个非常有趣的挑战。我以某种方式解决了它-我认为-有点无聊和冗长,但是嘿。它的工作原理是(相对)快速,而且特别有趣。
想法如下:从左上角一直到右下角检查每个像素。是白色像素吗?忽视。它是彩色的吗?很酷,让我们跟踪它并尝试确定其边界(左上,右上,左下,右下)。
完成后,检查每个矩形的区域。它包含的颜色是否不同于矩形的颜色?然后找出哪个矩形属于该颜色并将该重叠矩形的z-index更新1。
最后,在考虑z索引的同时绘制所有矩形。实际上,它的工作原理就像您从CSS和其他3D产品中了解的z-index。首先绘制具有最低z索引的矩形,最后绘制最高z索引的矩形。
import java.awt.*;import java.awt.image.*;import java.io.File;import java.util.*;import java.util.List;import javax.imageio.*;class A{class R{public Color k=new Color(-1);public int z;public Point a;public Point b;public Point c;public Point d;}public static void main(String[]w)throws Exception{BufferedImage i=ImageIO.read(new File(w[0]));List<R>r=new Vector<R>();for(int y=0;y<i.getHeight();y++){for(int x=0;x<i.getWidth();x++){Color c=new Color(i.getRGB(x,y));if(c.getRGB()==-1){continue;}R t=null;for(R s:r){if(s.k.equals(c)){t=s;}}if(t==null){t=new A().new R();r.add(t);}if(t.a==null){t.a=new Point(x, y);t.b=new Point(x, y);t.c=new Point(x, y);t.d=new Point(x, y);t.k=new Color(c.getRGB());}if(x<t.a.x){t.a.x=x;t.c.x=x;}if(x>t.b.x){t.b.x=x;t.d.x=x;}t.c.y=y;t.d.y=y;}}for(R s:r){List<Color>b=new Vector<Color>();for(int y=s.a.y;y<=s.c.y;y++){for(int x = s.a.x;x<=s.b.x;x++){if(i.getRGB(x, y)!=s.k.getRGB()){Color a=new Color(i.getRGB(x,y));boolean q=false;for(Color l:b){if(l.equals(a)){q=true;}}if(!q){b.add(a);} else {continue;}R f=null;for(R k:r){if(k.k.equals(a)){f=k;}}f.z=s.z+1;}}}}Collections.sort(r,new Comparator<R>(){public int compare(R a, R b){return a.z>b.z?1:(a.z==b.z?0:-1);}});for(int ii=r.size();ii>0;ii--){BufferedImage d=new BufferedImage(i.getWidth(),i.getHeight(),2);Graphics2D g=(Graphics2D)d.getGraphics();for(R s : r.subList(0, ii)){g.setColor(s.k);g.fillRect(s.a.x,s.a.y,s.b.x-s.a.x,s.c.y-s.a.y);}ImageIO.write(d,"png",new File(r.size()-ii+".png"));}}}
完整的代码有点儿-这是一个轻描淡写的;-)-更清晰地写在这里:http : //pastebin.com/UjxUUXRp
另外,既然我看到节食者的意见,我本来可以简化一些部分。确实没有必要找到颜色与另一个矩形重叠的矩形。我确实可以算出“入侵”颜色的数量。