Вы называете это Центрированием, я называю это Code Golf


16

«Давайте посмотрим правде в глаза, выровненные изображения, как маленькие подарки с небес. Добро пожаловать, но неожиданно».- Геобитс

+10000 репутации тому, кто выиграет это испытание.

Правила:

1) Вы должны создать программу.

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

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

4) Размер холста всегда будет между 100 x 100 и 2000 x 2000 пикселей. Это всегда будет прямоугольник, но не всегда квадрат.

5) Нет жесткого кодирования изображений или фанк-магии URL.

6) Нет внешних библиотек, которые будут использоваться.

Руководство по централизации (вариант Джошпаррона)

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

Это может быть достигнуто (и будет проверено) следующим способом.

1) Вообразите ограничивающую рамку вокруг объекта. (Черные линии добавлены для помощи)

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

2) Перемещайте объект до тех пор, пока край объекта не станет равным расстоянию от соответствующего края холста.

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

3) Теперь забудьте о черных линиях.

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

Входные данные:

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

Выход:

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

Больше входов здесь .

И соответствующие выводы здесь .

Репут +10000 - ложь.


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

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

Вы должны добавить некоторые особенности на изображениях, для которых это должно работать. Например, должно ли это работать для изображения, которое содержит в основном белый фон, но имеет дыры прозрачности? Или прозрачность означает, что не будет белого, и наоборот.
Бубалу

Извините, но объяснение очевидно. Коды RBGA приведены.
Джошпаррон

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

Ответы:


0

Python 3, 120 205 байт

РЕДАКТИРОВАТЬ : так как выходное изображение должно иметь такой же размер, как ввод, сценарий становится длиннее ...

РЕДАКТИРОВАТЬ 2 : Кажется, что правило 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.
Алекс Ван Лью

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
Msgstr "Изображение читается из файла 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.