“监视”图像


9

问题:

这个挑战来自我遇到的一个实际问题。我正在使用双显示器设置,我想使用以下图像作为墙纸:

理想形象

但是,我的显示器有很大的边框,当我设置背景时,它看起来像这样,在码头上出现(更平?)被打破了:

发行图片

我可以通过以下方式解决此问题:将中心切出,然后将其拉伸回原始大小,如下图所示:

挑战形象


挑战:

编写一个程序,以获取图像并“监视”它以用于双显示器设置(即删除图像的中央部分,即边框所在的位置)。规则如下:

  1. 它必须是一个完整的程序,它可以以路径(字符串参数等)或文件选择器对话框的形式接受图像。
  2. 程序必须以垂直线的数量(宽度为一个像素)为输入,以从图像中心切出
  3. 裁切必须来自原始图像的中心(横向)
  4. 结果图像必须重新缩放为输入图像的原始大小。(可以分别对这两个半部分进行缩放,然后进行级联,或者对这些半级进行合并,然后进行缩放。单独进行缩放可以产生更好的图像/效果,但是在现实世界中很难注意到)
  5. 背景图像通常是偶数的,因此,为了使此挑战更容易,输入图像将仅具有偶数个像素,并且要删除的行数也将仅是偶数。
  6. 这项挑战就是代码高尔夫-以字节为单位的最短代码获胜

祝好运!


2
1.从图片中不清楚操作是什么,因为它们被缩放到相同的宽度。也许用与中间尺寸相同并用白色填充的图像替换第一个和最后一个?2.我们可以使用任何形式的缩放(线性可能是最便宜的)还是必须是特定的缩放(例如立方,正弦等)?
彼得·泰勒

@PeterTaylor根据规则3,假定输入和输出图像的宽度相同。将每一半调整为原始宽度的一半,然后合并,或者将裁切后的两半合并,然后缩放回原始大小。是的,任何缩放都可以。
dberm22年

以“也许”开头的句子是关于如何使问题更容易理解的建议,而不是对挑战的建议解释。我自己做了改变。
彼得·泰勒

@PeterTaylor Ahh,我明白了,这更清楚了。谢谢。
dberm22年

我们可以假设图像是横向的吗?
Scott Milner

Answers:


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个字节,因为八度版本需要大量括号才能正确解析内联分配。

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代码,改进了奇数图像大小和奇数列数

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

只是增加一点:应对挑战的方法必须认真尝试针对给定的评分标准进行优化。在像这样的代码高尔夫球挑战中,这意味着必须进行任何明显的改进以减少代码的长度。

尝试删除未使用的空格和空白。
dkudriavtsev

@ ais523谢谢。最多220字节!
dberm22

同样,每个两个字节的变量也太多了。可读性并不重要,因此可以将其重构os为字母中的任何其他字母!为什么不将图像写回到输入图像f以保存整个图像strcat呢?(顺便说一句,您可以用代替,['',...]而不是strcat(...)
Sanchises

@Sanchises谢谢,这是未高尔夫版/改进版的遗留物。规则中没有任何内容表明它无法覆盖,也不需要具有漂亮的命名输出。谢谢...减少了70个字节的字节数!
dberm22

3

Wolfram语言,134127119个 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*)
)

从技术上讲,如果任何一个图像尺寸都超过362,880像素,它将无法正常工作,但我认为可以,因为这超出了问题(和某些计算机)的范围。固定!


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字节)以获得更好的结果。

不打高尔夫球

$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

通过将PNG结果发送到STDOUT,我可以再保存9个字节...但是为什么呢?


“我可以通过将PNG结果发送到STDOUT来节省9个字节,但这又是为了什么呢?” 那你可以运行类似的东西php -r image.php image.png 1 > output.png,对吧?
ʰᵈˑ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.