这个挑战来自我遇到的一个真正的问题。我在工作中安装了双显示器,我想用下面的图片作为我的壁纸:

然而,我的显示器有相当大的边框,当我设置我的背景时,它看起来像这样,码头出现的地方(码头?)被打破:

我能够解决这个问题,方法是用中心切出一个图像,然后把它拉回原来的大小,如下面的图像所示:

编写一个接收图像并对其进行“监视”的程序,以便与双监视器设置一起使用(即删除图像的中心部分,其中有边框)。这些规则如下:
发布于 2017-04-10 13:01:52
@(f,n)imsave(imresize((o=imread(f))(:,[1:(end-n)/2,(end+n)/2:end],:),size(o)(1:2)),f)定义具有f文件名的匿名函数,并n要删除的列数。由于匿名函数需要一个表达式,所以使用内联赋值,这是MATLAB中不存在的特性。
作为奖励,我还得到了一个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)发布于 2017-04-06 20:13:13
这是我在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);
endfunction 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));
endhttps://codegolf.stackexchange.com/questions/115616
复制相似问题