Você chama isso de centralização, eu chamo de código golfe


16

"Vamos ser sinceros, imagens alinhadas são como pequenos presentes do céu. Bem-vindo, mas inesperado." - Geobits

+10000 reputação para quem vencer este desafio.

Regras:

1) Você deve gerar um programa.

2) A entrada será uma imagem; no entanto, depende de você ser transmitida como um arquivo ou uma lista de números.

3) A saída será um arquivo que, quando aberto em tinta (ou similar), mostrará a imagem alinhada.

4) O tamanho da tela sempre estará entre 100 x 100 e 2000 x 2000 pixels. Sempre será um retângulo, mas nem sempre um quadrado.

5) Nenhuma codificação de imagens ou URL mágica funky.

6) Nenhuma biblioteca externa a ser usada.

Guia de centralização (variante Joshpbarron)

Uma imagem será definida como centralizada se o primeiro branco (255.255.255,> 0 rgba) ou transparente (x, y, z, 0 rgba) em um eixo estiver a uma distância igual (mais ou menos 1 pixel) da borda da tela.

Isso pode ser alcançado (e será verificado) pelo seguinte método.

1) Imagine uma caixa delimitadora ao redor do objeto. (Linhas pretas adicionadas para obter ajuda)

insira a descrição da imagem aqui

2) Mova o objeto até a borda do objeto estar a uma distância igual da borda apropriada da tela.

insira a descrição da imagem aqui

3) Agora esqueça as linhas pretas.

insira a descrição da imagem aqui

Entrada:

insira a descrição da imagem aqui

Resultado:

insira a descrição da imagem aqui

Mais entradas aqui .

E respectivas saídas aqui .

O representante +10000 é uma mentira.


o programa deve lidar com imagens completamente brancas / transparentes?
Cristian Lupascu

Como não há nada para centralizar, a mesma imagem deve ser retornada. O mesmo para imagens sem espaço vazio.
Joshpbarron

Você deve adicionar alguns detalhes específicos nas imagens para as quais isso deve funcionar. Por exemplo, deve funcionar para uma imagem que contenha um fundo predominantemente branco, mas com orifícios de transparência? Ou ter transparência significa que não haverá branco e vice-versa.
bubalou

Desculpe, mas a explicação é óbvia. Os códigos RBGA são fornecidos.
Joshpbarron

Na descrição, você fala sobre a distância do primeiro pixel branco / transparente a partir de uma borda. Você não quer dizer o primeiro não-branco ? Caso contrário, todas as entradas de amostra já são soluções, porque a distância do primeiro pixel branco de cada borda é 0, portanto as distâncias são todas iguais.
Reto Koradi 06/06/2015

Respostas:


0

Python 3, 120 205 bytes

EDIT : Como a imagem de saída deve ter o mesmo tamanho da entrada, o script fica mais longo ...

EDIT2 : Parece que a regra 6 (nenhuma biblioteca externa) foi adicionada depois que eu respondi; portanto, essa resposta deve ser considerada inválida de qualquer maneira :(

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

A versão anterior apenas cortou a imagem de entrada:

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

os dois scripts leem o nome do arquivo de imagem do stdin e salvam a imagem de saída como 'o.png'. por exemplo :

python3 script.py <<< s2rMqYo.png

Ele aceita pelo menos imagens PNG (potencialmente com um canal alfa) - 'ok' testado no aparelho fornecido pelo solicitante.

... esperando minha recompensa):


11
Não posso testar isso no momento, mas o tamanho da tela de saída corresponde ao tamanho da tela de entrada?
Joshpbarron 5/05

11
dica pro para os seus futuros empreendimentos Shell: python3 script.py <<< s2rMqYo.pngé mais limpo
undergroundmonorail

11
A saída deve ter o mesmo tamanho da entrada, sim.
Joshpbarron

3
Você está usando uma biblioteca (PIL), o que não é permitido. (PIL não pode ser chamado parte das bibliotecas padrão, porque não está incluído no Python por padrão.)
marinus

2
@ Marinus Eu acho que isso é um pouco duro. Isso afasta um grande número de linguagens de programação.
Decay Beta

2

HTML5 + JavaScript (ES5), 515 bytes

Essa contagem inclui as tags HTML, pois elas fazem parte do programa. Se você contar apenas o código de processamento da imagem, serão 376 bytes, incluindo o wrapper da função.

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

Entrada

Um URL para uma imagem.

Restrições de segurança

Como este programa está sendo executado em um ambiente de navegador, apenas URLs para imagens habilitadas para CORS funcionarão. Imgur está habilitado com CORS.

O IE 10 não suporta CORS. Ainda não testei no IE 11, mas funciona no Chrome e Firefox.

Como executar

  1. Digite / cole em uma URL no campo de entrada.
  2. Tire o foco (tabulação / clique de) do campo de entrada.

Resultado

Ele sai na tela da página.

Como este é um aplicativo baseado em navegador, as restrições de segurança impedem o download automático de um arquivo, mas você pode clicar com o botão direito e salvar a imagem no Chrome e Firefox. Ainda não testei no IE 11.

Demo

O código JavaScript foi removido do scriptelemento e colocado na área apropriada para acomodar os snippets de pilha:

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


Trabalho confirmado no Edge. Eu imagino que funcionaria no IE11 também.
Alex Van Liew

0

Processando 2 - 323 450

A imagem é lida no arquivo f.png na pasta de dados do esboço. Coloca a imagem e determina seus limites. Calcula a posição correta e substitui a imagem deslocada corretamente.

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

versão legível:

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

Exemplo de saída:

insira a descrição da imagem aquiinsira a descrição da imagem aquiinsira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

Você pode obter o processamento aqui


Você poderia fornecer um arquivo de saída de amostra para eu comparar.
Joshpbarron

É legal ... mas não é bem assim. As imagens de entrada têm um fundo transparente.
Joshpbarron

11
"A imagem é lida no arquivo f.png". Verdade? No seu código, eu vejo esta linha: PImage p=loadImage("h.png");no topo.
22415 SirPython

color(-1)e background(-1)cada 1 byte é menor que color(255)e background(255)respectivamente. E eu acho que você pode remover a P2Dna sizechamada
Kritixi Lithos
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.