당신은 그것을 중심이라고 부르고, 그것을 코드 골프라고 부릅니다.


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 담당자는 거짓말입니다.


프로그램이 완전히 흰색 / 투명한 이미지를 처리해야합니까?
Cristian Lupascu

가운데에 아무것도 없으므로 동일한 이미지가 반환되어야합니다. 빈 공간이없는 이미지의 경우에도 동일합니다.
Joshpbarron

이것이 작동하는 이미지에 몇 가지 구체적인 사항을 추가해야합니다. 예를 들어 대부분 흰색 배경을 포함하지만 투명도 구멍이있는 이미지에 적합합니까? 또는 투명성이 있다는 것은 흰색이 없다는 것을 의미하고 그 반대도 마찬가지입니다.
bubalou

죄송하지만 설명은 분명합니다. RBGA 코드가 제공됩니다.
Joshpbarron

설명에서는 가장자리에서 첫 번째 흰색 / 투명 픽셀의 거리에 대해 설명합니다. 첫 번째가 아닌 흰색 을 의미하지 않습니까? 그렇지 않으면 모든 샘플 입력은 이미 솔루션입니다. 각 에지에서 첫 번째 흰색 픽셀의 거리가 0이므로 거리가 모두 같습니다.
Reto Koradi 2016

답변:


0

파이썬 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 이미지 (알파 채널이있을 수 있음)를 수용합니다-asker가 제공 한 세트에 대해 'ok'를 테스트했습니다.

... 내 보상을 기다리는 중) :


1
분당 이것을 테스트 할 수 없지만 출력 캔버스 크기가 입력 캔버스 크기와 일치합니까?
Joshpbarron

1
미래의 쉘 노력을위한 프로 팁 : python3 script.py <<< s2rMqYo.png더 깨끗합니다
undergroundmonorail

1
출력은 입력과 크기가 같아야합니다 (예).
Joshpbarron

3
라이브러리 (PIL)를 사용하고 있으며 허용되지 않습니다. (PIL은 기본적으로 파이썬에 포함되어 있지 않기 때문에 표준 라이브러리의 일부라고 부를 수 없습니다.)
marinus

2
@marinus 나는 이것이 약간 가혹하다고 생각한다. 그것은 많은 프로그래밍 언어를 소외시킨다.
Beta Decay

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)>

입력

이미지의 URL입니다.

보안 제한

이 프로그램은 브라우저 환경에서 실행되므로 CORS 가능 이미지의 URL 만 작동합니다. Imgur는 CORS를 사용합니다.

IE 10은 CORS를 지원하지 않습니다. IE 11에서 아직 테스트하지는 않았지만 Chrome 및 Firefox에서 작동합니다.

달리는 방법

  1. 입력 필드에 URL을 입력 / 붙여 넣기하십시오.
  2. 입력 필드에서 초점을 맞 춥니 다 (탭 / 클릭 아웃).

산출

페이지의 캔버스에 출력됩니다.

이 브라우저 기반 응용 프로그램이므로 보안 제한으로 인해 파일이 자동으로 다운로드되지 않지만 마우스 오른쪽 버튼을 클릭하여 Chrome 및 Firefox에서 이미지를 저장할 수 있습니다. IE 11에서 아직 테스트하지 않았습니다.

데모

JavaScript 코드가 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)
  }
}
<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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.