이미지“모니터링”


9

문제 :

이 도전은 내가 가진 실제 문제에서 비롯됩니다. 직장에서 듀얼 모니터 설정을하고 있는데 다음 이미지를 배경 화면으로 사용하고 싶었습니다.

이상적인 이미지

그러나 내 모니터에는 상당히 큰 베젤이 있으며 배경을 설정하면 부두가 부서진 것처럼 보이는 것처럼 보입니다.

이슈 이미지

중앙에서 잘라낸 이미지를 만든 다음 아래 이미지와 같이 원래 크기로 다시 늘려서이 문제를 해결할 수있었습니다.

도전 이미지


도전 과제 :

이미지를 가져와 이중 모니터 설정과 함께 사용하기 위해 "모니터링"하는 프로그램을 작성하십시오 (예 : 베젤이있는 이미지의 가운데 부분을 삭제함). 규칙은 다음과 같습니다.

  1. 경로 (문자열 인수 등) 또는 파일 선택기 대화 상자의 형태로 이미지를 허용하는 전체 프로그램이어야합니다.
  2. 프로그램은 이미지의 중심에서 자르려면 수직선 수 (너비 1 픽셀)를 입력으로 가져와야합니다.
  3. 자르기는 원본 이미지의 가운데 (가로 방향)에서 가져와야합니다.
  4. 결과 이미지는 입력 이미지의 원래 크기로 다시 스케일되어야합니다. (반쪽을 개별적으로 확장 한 다음 연결하거나 연결 및 확장 할 수 있습니다. 개별적으로 확장하면 더 나은 이미지 / 효과가 생성되지만 실제 세계에서는 거의 눈에 띄지 않습니다)
  5. 배경 이미지는 일반적으로 짝수이므로이 문제를 쉽게하기 위해 입력 이미지에는 짝수의 픽셀 만 있고 제거 할 라인 수도 동일합니다.
  6. 이 도전은 코드 골프입니다-가장 짧은 코드는 바이트입니다

행운을 빕니다!


2
1. 같은 폭으로 크기가 조정되어 있기 때문에 그림에서 작업이 무엇인지 명확하지 않습니다. 아마도 첫 번째와 마지막 이미지를 중간 이미지와 크기가 같고 흰색으로 채워진 이미지로 바꾸겠습니까? 2. 어떤 형태의 리 스케일링을 사용할 수 있습니까 (선형이 가장 저렴할 수 있습니까) 아니면 특정 형태 (예 : 3 차, sinc 등) 여야합니까?
피터 테일러

@PeterTaylor 규칙 3에 따라 입력 및 출력 이미지의 너비는 동일해야합니다. 각 절반의 크기를 원래 너비의 절반으로 조정 한 다음 연결하거나 잘라낸 반쪽을 연결 한 다음 원래 크기로 다시 조정합니다. 그리고 네, 모든 스케일링은 괜찮습니다.
dberm22

"아마도"로 시작하는 문장은 도전에 대한 제안 된 해석이 아니라 질문을 이해하기 쉽게 만드는 방법에 대한 제안이었습니다. 나는 스스로 변경했다.
피터 테일러

@PeterTaylor Ahh, 알다시피, 더 명확 해집니다. 감사.
dberm22

이미지가 가로 방향이라고 가정 할 수 있습니까?
Scott Milner

답변:


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 호환 답변도 골프했습니다. 흥미롭게도 Octave 버전은 인라인 할당을 올바르게 구문 분석하기 위해 많은 괄호가 필요하기 때문에 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

홀수 이미지 크기 및 홀수 열이 개선 된 언 골프 코드

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

또한 모든 2 바이트 변수는 하나가 너무 많습니다. 가독성은 중요하지 않으므로 os알파벳의 다른 문자를 리팩터링 하십시오! 그리고 f전체 이미지 를 저장하기 위해 이미지 를 입력 이미지 에 다시 쓰는 것이 strcat어떻습니까? ( ['',...]strcat(...)
실수

@Sanchises 고마워, 그것은 ungolfed / 향상된 버전에서 남은 것입니다. 규칙의 어떤 것도 덮어 쓸 수 없거나 꽤 명명 된 출력이 필요하다고 언급 한 것은 없습니다. 감사합니다 ... 바이트 수가 70 바이트 감소했습니다!
dberm22

3

Wolfram Language, 134 , 127 , 119111 바이트

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의 기호)으로, 정수를 두 번째 입력으로 사용 하는 함수 를 만듭니다 .

언 골프 :

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.

더 나은 결과를 위해 (+2 바이트) imagecopyresampled대신에 사용할 수 있습니다 imagecopyresized.

언 골프

$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.
ʰᵈˑ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.