«Мониторинг» изображения


9

Проблема:

Эта проблема возникла из-за реальной проблемы, с которой я столкнулся. У меня настроен двойной монитор на работе, и я хотел использовать следующее изображение в качестве обоев:

Идеальное изображение

Тем не менее, у моих мониторов довольно значительные рамки, и когда я устанавливаю фон, это выглядит примерно так, где появляется пирс (appiers?), Который будет сломан:

Изображение проблемы

Я смог решить эту проблему, сделав изображение с вырезанным из него центром, а затем растянув его до исходного размера, как показано на рисунке ниже:

Изображение вызова


Соревнование:

Напишите программу, которая принимает изображение и «контролирует» его для использования с настройкой двойного монитора (т.е. удаляет центральную часть изображения, где находятся рамки). Правила следующие:

  1. Это должна быть полная программа, которая принимает изображение либо в виде пути (строковый аргумент и т. Д.), Либо в форме диалогового окна выбора файла.
  2. Программа должна взять в качестве входных данных количество вертикальных линий (один пиксель в ширину), чтобы обрезать от центра изображения
  3. Обрезка должна исходить из центра (по ширине) исходного изображения
  4. Результирующее изображение должно быть уменьшено до исходного размера входного изображения. (Либо половинки можно масштабировать по отдельности, а затем объединять или объединять, а затем масштабировать. Индивидуальное масштабирование дает лучшее изображение / эффект, но вряд ли заметно в реальном мире)
  5. Фоновые изображения, как правило, являются четными, поэтому для облегчения этой задачи входные изображения будут иметь только четное количество пикселей, а количество удаляемых строк будет также ровным.
  6. Это испытание кода гольф - выигрывает самый короткий код в байтах

Удачи!


2
1. Из рисунков не очень ясно, какова операция, потому что они масштабируются до одинаковой ширины. Возможно, замените первый и последний изображения размером, равным среднему и дополненным белым? 2. Можем ли мы использовать любую форму масштабирования (линейная, вероятно, самая дешевая) или она должна быть определенной (например, кубическая, синк и т. Д.)?
Питер Тейлор

@PeterTaylor Согласно правилу 3 входные и выходные изображения должны иметь одинаковую ширину. Либо каждая половина изменяется до половины первоначальной ширины, а затем объединяется, либо обрезанные половинки объединяются, а затем уменьшаются до исходного размера. И да, любое масштабирование в порядке.
dberm22

Предложение, начинающееся с «Возможно», было предложением о том, как облегчить понимание вопроса, а не предложенной интерпретацией проблемы. Я сделал изменения сам.
Питер Тейлор

@PeterTaylor Ааа, понятно, это проясняет. Спасибо.
dberm22

Можно ли предположить, что изображение будет ориентировано на ландшафт?
Скотт Милнер

Ответы:


1

Октава, 85 байт

@(f,n)imsave(imresize((o=imread(f))(:,[1:(end-n)/2,(end+n)/2:end],:),size(o)(1:2)),f)

Определяет анонимную функцию с fименем файла и nколичеством удаляемых столбцов. Поскольку анонимная функция требует одного выражения, используется встроенное присваивание, функция, отсутствующая в MATLAB.

MATLAB, 98 байт

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

function  m(f,n)
o=imread(f);imsave(imresize(o(:,[1:(end-n)/2,(end+n)/2:end],:),size(o(:,:,1))),f)

5

Matlab 2013, 150 байт

Вот моя попытка в Matlab. Определенно не будет самым коротким кодом, но это только начало.

Внимание, это перезаписывает исходное изображение, поэтому сначала сделайте копию.

Гольф версия

function  mi(f,n)
o=imread(f);
s=size(o);
imwrite([imresize(o(:,1:((s(2)-n)/2),:),[s(1),s(2)/2]) imresize(o(:,((s(2)+n)/2):end,:),[s(1),s(2)/2])], f);
end

Ungolfed Code, с улучшениями для нечетных размеров изображения и нечетного числа столбцов

function  monitorizeImage( filename, num_columns )

orig = imread(filename);
orig_size = size(orig);

f = factor(orig_size(2));
origsize_iseven = f(1)==2;

f = factor(num_columns);
num_columns_iseven = f(1)==2;

odd_even_size_mismatch = xor(origsize_iseven,num_columns_iseven);

img_resized = imresize(orig,[orig_size(1) orig_size(2)+odd_even_size_mismatch]);

leftimg = img_resized(:,1:((orig_size(2)+odd_even_size_mismatch-num_columns)/2),:);
leftimg = imresize(leftimg,[orig_size(1),floor(orig_size(2)/2)]);
rightimg = img_resized(:,((orig_size(2)-odd_even_size_mismatch+num_columns)/2):end,:);
rightimg = imresize(rightimg,[orig_size(1),floor(orig_size(2)/2)]);

monitorized_image = [leftimg rightimg];
monitorized_image = imresize(monitorized_image,[orig_size(1),orig_size(2)+ ~origsize_iseven]);

[~, ~, ext] = fileparts(filename); 

imwrite(monitorized_image,strcat(filename(1:end-length(ext)),'_',num2str(num_columns),ext));

end

Просто добавлю к этому: ответы на вызовы должны сделать серьезную попытку оптимизации по заданному критерию оценки. В коде-гольф вызов , как этот, это означает , что любые очевидные улучшения , которые бы уменьшить длину кода должны быть сделаны.

Попробуйте удалить неиспользуемые пробелы и пробелы.
дкудрявцев

@ ais523 Спасибо. До 220 байт!
dberm22

Кроме того, каждая двухбайтовая переменная - это слишком много. Читаемость не важна, поэтому рефакторинг osи т. Д. Для любой другой буквы в алфавите! И почему бы просто не записать изображение обратно на входное изображение, fчтобы сохранить его целиком strcat? (который, кстати, вы можете заменить ['',...]вместо strcat(...))
Sanchises

@Sanchises Спасибо, это был пережиток не улучшенной / улучшенной версии. Ничто в правилах не указывало, что оно не могло перезаписать или нуждалось в красивых именованных выходных данных. Спасибо ... это уменьшило количество байтов на 70 байтов!
dberm22

3

Wolfram Language, 134 , 127 , 119 111 байтов

f[i_,c_]:=(d=ImageDimensions@i;ImageAssemble[ImageTake[i,a=All,#]&/@{{0,e=-#&@@d/2-c/2},{-e,a}}]~ImageResize~d)

Создает функцию, fкоторая принимает изображение в качестве первого ввода (в качестве символа в Mathematica или Wolfram Cloud) и целое число в качестве второго ввода.

Ungolfed :

f[image_,columns_]:=(  (*Define Function*)
    d=ImageDimensions[image];  (*Get image dimensions*)
    e=d[[1]]/2+columns/2;  (*Add half the image width to half the number of removed columns*)
    ImageResize[ImageAssemble[Map[ImageTake[i,All,#]&,{{0,-e},{e,All}}]],d]  (*Map the function onto a list with the desired column ranges and merge and scale the resulting image*)
)

Технически, это не будет работать должным образом, если любое из размеров изображения превысит 362880 пикселей, но я предполагаю, что это нормально, так как это далеко выходит за рамки проблемы (и некоторых компьютеров). Исправлена!


2

PHP, 206 байт

($c=imagecopyresized)($t=imagecreatetruecolor($w=imagesx($s=imagecreatefrompng($argv[1])),$h=imagesy($s)),$s,0,0,0,0,$v=$w/2,$h,$x=$v-$argv[2]/2,$h);$c($t,$s,$v,0,$w-$x,0,$v,$h,$x,$h);imagepng($t,$argv[3]);

принимает три аргумента командной строки: имя исходного файла, количество строк для обрезки и целевое имя файла. Беги с -r.

Вы можете использовать imagecopyresampledвместо imagecopyresized(+2 байта) для лучшего результата.

ungolfed

$s=imagecreatefrompng($argv[1]);    # load source image
$w=imagesx($s);$h=imagesy($s);      # get image dimensions
$t=imagecreatetruecolor($w,$h);     # create target image
$v=$w/2;                            # $v = half width
$x=$v-$argv[2]/2;                   # $x = width of remaining halves
                                    # resize and copy halves:
imagecopyresized($t,$s, 0,0,    0,0,$v,$h,$x,$h);
imagecopyresized($t,$s,$v,0,$w-$x,0,$v,$h,$x,$h);
imagepng($t,$argv[3]);              # save target image

Я мог бы сохранить еще 9 байтов, отправив результат PNG в STDOUT ... но зачем?


«Я мог бы сохранить еще 9 байтов, отправив результат PNG в STDOUT ... но зачем?» Тогда вы могли бы запустить что-то вроде php -r image.php image.png 1 > output.png, верно?
ʰᵈˑ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.