Ви називаєте це Центринг, я називаю це Кодом Гольф


16

"Поміркуймо, вирівняні зображення - це маленькі подарунки з Неба. Ласкаво просимо, але несподівано". - Геобіт

+10000 репутація того, хто виграє цей виклик.

Правила:

1) Ви повинні створити програму.

2) Вхідним буде зображення, однак незалежно від того, чи ви передаєте його як файл або список номерів.

3) Виведенням буде файл, який при відкритті фарбою (або подібним) покаже зображення, вирівняне.

4) Розмір полотна завжди буде від 100 х 100 до 2000 х 2000 пікселів. Це завжди буде прямокутник, але не завжди квадрат.

5) Немає жорсткого кодування зображень чи манірних URL-магій.

6) Жодних зовнішніх бібліотек не можна використовувати.

Керівництво по централізації (варіант Джошпбаррона)

Зображення буде визначено як по центру, якщо 1-й білий (255,255,255,> 0 rgba) або прозорий (x, y, z, 0 rgba) на осі дорівнює відстані (плюс або мінус 1 піксель) від краю полотна.

Цього можна досягти (і буде перевірено) наступним методом.

1) Уявіть обмежувальну коробку навколо об'єкта. (Для допомоги додано чорні лінії)

введіть тут опис зображення

2) Рухайте предмет навколо, поки край предмета не дорівнює відстані від відповідного краю полотна.

введіть тут опис зображення

3) Тепер забудьте про чорні лінії.

введіть тут опис зображення

Вхід:

введіть тут опис зображення

Вихід:

введіть тут опис зображення

Більше інформації тут .

І відповідні результати тут .

+10000 повторень - брехня.


чи повинна програма обробляти повністю білі / прозорі зображення?
Крістіан Лупаску

Оскільки в центрі немає нічого, слід повернути те саме зображення. Те саме для зображень без порожнього місця.
Джошпбаррон

Ви повинні додати деякі характеристики зображень, для яких це повинно працювати. Наприклад, чи має це працювати на зображення, яке містить переважно білий фон, але має отвори прозорості? Або якщо прозорість означає, що білого не буде, і навпаки.
bubalou

Вибачте, але пояснення очевидно. Наведені коди RBGA.
Джошпбаррон

В описі ви говорите про відстань першого білого / прозорого пікселя від краю. Ви не маєте на увазі першого не- білого? Інакше всі зразки вхідних даних вже є рішеннями, оскільки відстань першого білого пікселя від кожного краю дорівнює 0, тому всі відстані всі рівні.
Рето Коради

Відповіді:


0

Python 3, 120 205 байт

EDIT : Оскільки вихідне зображення має мати той же розмір, що і вхідне, сценарій стає довшим ...

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 (можливо, з альфа-каналом) - випробувано "добре" на наборі, наданому запитувачем.

... чекаю моєї нагороди):


1
Я не можу перевірити це за хвилину, але чи відповідає розмір вихідного полотна вхідному розміру полотна?
Джошпбаррон

1
підказка для ваших майбутніх зусиль з оболонками: python3 script.py <<< s2rMqYo.pngчистіше
підземний

1
Вихід повинен бути того ж розміру, що і вхід, так.
Джошпбаррон

3
Ви використовуєте бібліотеку (PIL), яка заборонена. (PIL не можна назвати частиною стандартних бібліотек, оскільки він за замовчуванням не входить до Python.)
marinus

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-адреса до зображення.

Обмеження безпеки

Оскільки ця програма працює в середовищі браузера, працюватимуть лише URL-адреси зображень із підтримкою CORS . 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");

Приклад виводу:

введіть тут опис зображеннявведіть тут опис зображеннявведіть тут опис зображення введіть тут опис зображення введіть тут опис зображення

Ви можете отримати обробку тут


Не могли б ви надати зразок вихідного файлу для порівняння.
Джошпбаррон

Приємно ... але не зовсім. Вхідні зображення мають прозорий фон.
Джошпбаррон

1
"Зображення зчитується з файлу f.png". Дійсно? У вашому коді я бачу цей рядок: PImage p=loadImage("h.png");на самому верху.
SirPython

color(-1)і background(-1)кожен на 1 байт коротший color(255)і background(255)відповідно. І я думаю , що ви можете видалити P2Dв sizeвиклику
Kritixi LITHOS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.