あなたはそれをセンタリングと呼びます、私はそれをコードゴルフと呼びます


16

「それでは、並べられた画像は天国からの小さな贈り物のようなものです。ようこそ、しかし予期せぬことです。」-ジオビット

このチャレンジに勝った人には+10000の評判。

ルール:

1)プログラムを生成します。

2)入力は画像になりますが、ファイルとして渡されるか数字のリストとして渡されるかはユーザー次第です。

3)出力は、ペイント(または同様の)で開くと、画像が整列して表示されるファイルです。

4)キャンバスのサイズは常に100 x 100から2000 x 2000ピクセルの間です。常に長方形になりますが、常に正方形になるとは限りません。

5)画像のハードコーディングやファンキーなURLマジックはありません。

6)使用する外部ライブラリはありません。

集中化ガイド(Joshpbarron Variant)

軸上の最初の白(255,255,255、> 0 rgba)または透明(x、y、z、0 rgba)がキャンバスの端から等しい距離(プラスまたはマイナス1ピクセル)の場合、画像は中央にあると定義されます。

これは、次の方法で実現できます(検証されます)。

1)オブジェクトの周りの境界ボックスを想像してください。(ヘルプのために黒い線が追加されました)

ここに画像の説明を入力してください

2)オブジェクトの端がキャンバスの適切な端から等距離になるまでオブジェクトを移動します。

ここに画像の説明を入力してください

3)黒い線を忘れます。

ここに画像の説明を入力してください

入力:

ここに画像の説明を入力してください

出力:

ここに画像の説明を入力してください

その他の入力はこちら

ここでそれぞれの出力。

+10000担当者は嘘です。


プログラムは完全に白/透明な画像を処理する必要がありますか?
クリスチャンルパスク

中央に何もないので、同じ画像が返されるはずです。空のスペースのない画像でも同じです。
ジョシュバロン

これが機能するはずの画像にいくつかの詳細を追加する必要があります。たとえば、ほとんど白い背景を含んでいるが透明の穴がある画像に対しては機能しますか?または、透明性があるということは、白がないことを意味します。
bubalou

申し訳ありませんが、説明は明白です。RBGAコードが記載されています。
ジョシュバプロン

説明では、エッジから最初の白/透明ピクセルの距離について説明します。最初の白人を意味しませんか?それ以外の場合、各エッジからの最初の白いピクセルの距離は0であるため、すべてのサンプル入力は既にソリューションです。したがって、それらの距離はすべて等しくなります。
レトコラディ

回答:


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画像(アルファチャネルが含まれる可能性があります)を受け入れます-askerが提供するセットで「OK」をテストしました。

...私の報酬を待っています):


1
これをすぐにテストすることはできませんが、出力キャンバスのサイズは入力キャンバスのサイズと一致しますか?
ジョシュバプロン

1
あなたの将来のシェルの努力のためのプロのヒント:python3 script.py <<< s2rMqYo.pngきれいです
地下

1
出力は、入力と同じサイズでなければなりません、はい。
ジョシュバロン

3
ライブラリ(PIL)を使用していますが、これは許可されていません。(PILは、デフォルトではPythonに含まれていないため、標準ライブラリの一部と呼ぶことはできません。)
マリナス

2
@marinusこれは少し厳しいと思います。それは膨大な数のプログラミング言語を疎外します。
ベータ崩壊

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でも機能すると思います。
アレックスヴァンリュー

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

出力例:

ここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

ここで処理を取得できます


比較するサンプル出力ファイルを提供してください。
ジョシュバプロン

それは素晴らしい...しかし、まったくそうではありません。入力画像の背景は透明です。
ジョシュバプロン

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.