您称它为居中,我称其为Code Golf


16

“让我们面对现实吧,对齐的图像就像来自天堂的小礼物。欢迎,但出乎意料。” -地球位

赢得挑战者可获得10000点声望。

规则:

1)您将生成一个程序。

2)输入将是图像,但是输入是作为文件传递还是由数字列表决定。

3)输出将是一个文件,该文件在用油漆(或类似物品)打开时将显示对齐的图像。

4)画布大小将始终在100 x 100和2000 x 2000像素之间。它将始终是矩形,但并不总是正方形。

5)没有图像的硬编码或时髦的URL魔术。

6)无需使用外部库。

集中化指南(Joshpbarron变体)

如果轴上的第一个白色(255,255,255,> 0 rgba)或透明(x,y,z,0 rgba)与画布边缘的距离相等(正负1个像素),则图像将被定义为居中。

这可以通过以下方法来实现(并将通过以下方法进行验证)。

1)想象一下对象周围的边界框。(添加黑线以寻求帮助)

在此处输入图片说明

2)移动对象,直到对象的边缘与画布的适当边缘相等的距离。

在此处输入图片说明

3)现在忘记黑线。

在此处输入图片说明

输入:

在此处输入图片说明

输出:

在此处输入图片说明

这里有更多输入。

以及各自的输出在这里

+10000代表是谎言。


程序应该处理完全白色/透明的图像吗?
克里斯蒂安·卢帕斯库

由于没有任何内容可以居中,因此应返回相同的图像。对于没有空白空间的图像也是如此。
Joshpbarron

您应该在应该使用的图像上添加一些细节。例如,它是否应适用于大多数背景为白色但有透明洞的图像?或具有透明性意味着没有白色,反之亦然。
bubalou

对不起,但是解释很明显。给出了RBGA代码。
Joshpbarron

在描述中,您将讨论第一个白色/透明像素到边缘的距离。您不是说第一个白人吗?否则,所有样本输入都已经是解决方案,因为第一个白色像素到每个边缘的距离为0,因此这些距离都相等。
Reto Koradi 2015年

Answers:


0

Python 3中,120个 205字节

编辑:由于输出图像必须具有与输入相同的大小,因此脚本会变得更长...

EDIT2:似乎在我回答后已经添加了规则6(没有外部库),所以无论如何,这个回答都被认为是无效的:(

from PIL.Image import*;from PIL.ImageOps import*
c='RGB';i=open(input()).convert(c);w,h=i.size
o,a=new(c,(w,h),'white'),i.crop(invert(i).getbbox())
e,f=a.size;o.paste(a,((w-e)//2,(h-f)//2));o.save('o.png')

前一个版本只是裁剪了输入图像:

from PIL.Image import*;from PIL.ImageOps import*
i=open(input()).convert('RGB')
i.crop(invert(i).getbbox()).save('o.png')

这两个脚本都从stdin读取图像文件名,并将输出图像另存为'o.png'。例如 :

python3 script.py <<< s2rMqYo.png

它至少接受PNG图像(可能带有Alpha通道)-在问询者提供的设置上经过“确定”测试。

...等待我的报酬):


1
我目前无法对此进行测试,但是输出画布大小是否与输入画布大小匹配?
Joshpbarron

1
有关您未来的外壳工作的专业建议:python3 script.py <<< s2rMqYo.png更清洁
Undergroundmonorail

1
输出必须与输入大小相同,是的。
Joshpbarron

3
您正在使用不允许使用的库(PIL)。(不能将PIL称为标准库的一部分,因为默认情况下它不包含在Python中。)
marinus 2015年

2
@marinus我认为这有点苛刻。这疏远了大量的编程语言。
Beta Decay's

2

HTML5 + JavaScript(ES5),515字节

该计数包括HTML标记,因为它们是程序的一部分。如果仅计算图像处理代码,则包括函数包装器在内为376个字节

<canvas id=o></canvas><script>f=function(p){o=new Image();o.crossOrigin='Anonymous';o.src=p;o.onload=function(){v=document.getElementById('o'),c=v.getContext('2d');v.width=l=w=o.width;v.height=t=h=o.height;c.drawImage(o,0,0);for(k=255,d=c[g='getImageData'](0,0,w,h).data,r=b=i=0;i<d.length;)if((d[i++]<k||d[i++]<k||d[i++]<k)&&d[i++]){x=i/4%w;y=~~(i/4/w);l=l<x?l:x;t=t<y?t:y;b=b>y?b:y;r=r>x?r:x}n=c[g](l,t,r-l+1,b-t+1);c.clearRect(0,0,w,h);c.putImageData(n,(w-r+l)/2,(h-b+t)/2)}}</script><input onblur=f(this.value)>

输入值

图片的网址。

安全限制

因为此程序在浏览器环境中运行,所以只有指向启用CORS的图像的 URL有效。Imgur已启用CORS。

IE 10不支持CORS。我尚未在IE 11中进行测试,但确实可以在Chrome和Firefox中使用。

怎么跑

  1. 在输入字段中输入/粘贴URL。
  2. 从输入字段中散焦(跳出/单击退出)。

输出量

它在页面上的画布上输出。

由于这是基于浏览器的应用程序,因此安全限制阻止了文件的自动下载,但是您可以右键单击并将图像保存在Chrome和Firefox中。我尚未在IE 11上进行测试。

演示版

JavaScript代码已从script元素中删除,并放入适当的区域以容纳Stack Snippets:

f = function(p) {
  o = new Image();
  o.crossOrigin = 'Anonymous';
  o.src = p;
  o.onload = function() {
    v = document.getElementById('o'), c = v.getContext('2d');
    v.width = l = w = o.width;
    v.height = t = h = o.height;
    c.drawImage(o, 0, 0);
    for (k = 255, d = c[g = 'getImageData'](0, 0, w, h).data, r = b = i = 0; i < d.length;)
      if ((d[i++] < k || d[i++] < k || d[i++] < k) && d[i++]) {
        x = i / 4 % w;
        y = ~~(i / 4 / w);
        l = l < x ? l : x;
        t = t < y ? t : y;
        b = b > y ? b : y;
        r = r > x ? r : x
      }
    n = c[g](l, t, r - l + 1, b - t + 1);
    c.clearRect(0, 0, w, h);
    c.putImageData(n, (w - r + l) / 2, (h - b + t) / 2)
  }
}
<canvas id=o></canvas>
<input onblur=f(this.value)>


确认在Edge中工作。我想它也可以在IE11中使用。
Alex Van Liew

0

处理2 - 323 450

从草图的数据文件夹中的文件f.png中读取图像。放置图像并确定其边界。计算正确的位置并替换正确偏移的图像。

PImage p=loadImage("h.png");int a,b,c,d,x,y,w,i,n,m,t;a=w=p.width;c=i=p.height;clear();size(w,i,P2D);x=y=b=d=t=0;image(p,0,0);loadPixels();while(x<w*i){if(pixels[x]==color(255))t=1;x++;}x=0;background(255);image(p,0,0);loadPixels();while(y*w+x<w*i){if(pixels[y*w+x]!=color(255)){if(x<a)a=x;if(x>b)b=x;if(y<c)c=y;if(y>d)d=y;}x++;if(x==w){x=0;y++;}}n=(w-(b-a))/2;m=(i-(d-c))/2;clear();if(t>0)background(255);image(p,n-a,m-c);loadPixels();save("g.png");

可读版本:

PImage p=loadImage("h.png");
int a,b,c,d,x,y,w,i,n,m,t;
a=w=p.width;
c=i=p.height;
clear();
size(w,i,P2D);
x=y=b=d=t=0;
image(p,0,0);
loadPixels();
while(x<w*i)
{
 if(pixels[x]==color(255))t=1;
 x++;
}
x=0;
background(255);
image(p,0,0);
loadPixels(); 
while(y*w+x<w*i)
{
 if(pixels[y*w+x]!=color(255))
 {
   if(x<a)a=x;
   if(x>b)b=x;
   if(y<c)c=y;
   if(y>d)d=y;
 }
 x++;
 if(x==w){x=0;y++;}
}
n=(w-(b-a))/2;
m=(i-(d-c))/2;
clear();
if(t>0)background(255);
image(p,n-a,m-c);
loadPixels();
save("g.png");

输出示例:

在此处输入图片说明在此处输入图片说明在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

你可以在这里得到处理


您能否提供样本输出文件供我比较。
Joshpbarron

很好...但不完全是。输入图像具有透明背景。
Joshpbarron

1
“从文件f.png中读取图像”。真?在您的代码中,我看到以下一行:PImage p=loadImage("h.png");在最顶部。
SirPython

color(-1)并且background(-1)每个都比1个字节短color(255)background(255)。我认为你可以删除P2Dsize通话
Kritixi LITHOS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.