„Monitoruj” obraz

9

Problem:

To wyzwanie wynika z prawdziwego problemu, który miałem. Mam konfigurację z dwoma monitorami w pracy i chciałem użyć następującego obrazu jako tapety:

Idealny obraz

Jednak moje monitory mają dość znaczące ramki, a kiedy ustawiam tło, wygląda to mniej więcej tak, że molo (appier?) Jest zepsute:

Obraz problemu

Udało mi się to rozwiązać, wykonując obraz z wyciętym środkiem, a następnie rozciągając go z powrotem do oryginalnego rozmiaru, jak na poniższym obrazku:

Zdjęcie wyzwania


Wyzwanie:

Napisz program, który pobiera obraz i „monitoruje” go w celu użycia z konfiguracją z dwoma monitorami (tj. Usuwa środkową część obrazu, gdzie znajdują się ramki). Reguły są następujące:

  1. Musi to być pełny program, który akceptuje obraz jako ścieżkę (argument ciągu itp.) Lub w formie okna dialogowego wyboru plików.
  2. Program musi przyjąć jako dane wejściowe liczbę pionowych linii (o szerokości jednego piksela), aby wykadrować je ze środka obrazu
  3. Kadrowanie musi pochodzić ze środka (szerokości) oryginalnego obrazu
  4. Powstały obraz musi zostać ponownie przeskalowany do oryginalnego rozmiaru obrazu wejściowego. (Połówki można skalować indywidualnie, a następnie konkatenować lub konkatenować, a następnie skalować. Skalowanie indywidualnie daje lepszy obraz / efekt, ale w rzeczywistości nie jest zauważalne)
  5. Obrazy tła są na ogół równe, więc aby ułatwić to wyzwanie, obrazy wejściowe będą miały tylko parzystą liczbę pikseli, a liczba linii do usunięcia będzie równa.
  6. Wyzwaniem jest kod golfowy - wygrywa najkrótszy kod w bajtach

Powodzenia!

dberm22
źródło
2
1. Na zdjęciach nie jest jasne, czym jest operacja, ponieważ są one skalowane do tej samej szerokości. Być może zastąpisz pierwszy i ostatni obrazami o tym samym rozmiarze co środkowy i wypełnionym białym? 2. Czy możemy zastosować dowolną formę przeskalowania (liniowa jest prawdopodobnie najtańsza), czy też musi to być konkretna (np. Sześcienna, cynkowa itp.)?
Peter Taylor,
@PeterTaylor Zgodnie z regułą 3 obrazy wejściowe i wyjściowe powinny mieć tę samą szerokość. Każda połowa jest zmniejszana do połowy oryginalnej szerokości, a następnie konkatenowana lub przycięte połówki są konkatenowane, a następnie skalowane z powrotem do oryginalnego rozmiaru. I tak, każde skalowanie jest w porządku.
dberm22
Zdanie rozpoczynające się „Być może” było sugestią, jak uczynić pytanie łatwiejszym do zrozumienia, a nie sugerowaną interpretacją wyzwania. Sam dokonałem zmiany.
Peter Taylor,
@PeterTaylor Ahh, rozumiem, to czyni to jaśniejszym. Dzięki.
dberm22
Czy możemy założyć, że obraz będzie zorientowany poziomo?
Scott Milner,

Odpowiedzi:

1

Oktawa, 85 bajtów

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

Definiuje anonimową funkcję z fnazwą pliku i nliczbą kolumn do usunięcia. Ponieważ anonimowa funkcja wymaga pojedynczego wyrażenia, używane jest przypisanie wewnętrzne, funkcja nieobecna w MATLAB.

MATLAB, 98 bajtów

Jako bonus grałem też w odpowiedź zgodną z MATLAB. Co ciekawe, jest to tylko 13 bajtów dłużej, ponieważ wersja Octave wymaga wielu nawiasów, aby poprawnie przeanalizować przypisania wbudowane.

function  m(f,n)
o=imread(f);imsave(imresize(o(:,[1:(end-n)/2,(end+n)/2:end],:),size(o(:,:,1))),f)
Sanchises
źródło
5

Matlab 2013, 150 bajtów

Oto moja próba w Matlabie. Zdecydowanie nie będzie najkrótszym kodem, ale to początek.

Uwaga, to zastępuje oryginalny obraz, więc najpierw wykonaj kopię.

Wersja golfowa

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

Kod niepoznany z ulepszeniami dla nieparzystych rozmiarów obrazów i nieparzystej liczby kolumn

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
dberm22
źródło
Dodając do tego: odpowiedzi na wyzwania muszą podjąć poważną próbę optymalizacji pod kątem danego kryterium punktacji. W takim wyzwaniu, jak ten golf , oznacza to, że należy wprowadzić wszelkie oczywiste ulepszenia, które zmniejszyłyby długość kodu.
Spróbuj usunąć nieużywane spacje i białe znaki.
dkudriavtsev
@ ais523 Dzięki. Do 220 bajtów!
dberm22
Ponadto każda dwubajtowa zmienna jest o jeden za dużo. Czytelność nie jest ważna, więc refaktoryzuj ositd. Do dowolnej innej litery w alfabecie! A może po prostu zapisać obraz z powrotem do obrazu wejściowego, faby zapisać całość strcat? (które, nawiasem mówiąc, można zastąpić ['',...]zamiast strcat(...))
Sanchises
@ Sanchises Dzięki, to była pozostałość po ulepszonej wersji gry. Nic w regułach nie stanowiło, że nie można go zastąpić ani że nie musi mieć nazwanych wyników. Dzięki ... to zmniejszyło liczbę bajtów o 70 bajtów!
dberm22
3

Wolfram Language, 134 , 127 , 119 111 bajtów

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

Tworzy funkcję, fktóra pobiera obraz jako pierwsze wejście (jako symbol w Mathematica lub w chmurze Wolfram), a liczba całkowita jako drugie wejście.

Nie golfowany :

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*)
)

Technicznie nie będzie działać poprawnie, jeśli którykolwiek z wymiarów obrazu przekroczy 362 880 pikseli, ale zakładam, że jest w porządku, ponieważ jest to znacznie poza zakresem problemu (i niektórych komputerów). Naprawiony!

Scott Milner
źródło
2

PHP, 206 bajtów

($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]);

pobiera trzy argumenty wiersza poleceń: nazwę pliku źródłowego, liczbę wierszy do przycięcia i docelową nazwę pliku. Uruchom z -r.

Możesz użyć imagecopyresampledzamiast imagecopyresized(+2 bajtów), aby uzyskać lepszy wynik.

bez golfa

$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

Mógłbym zaoszczędzić jeszcze 9 bajtów, wysyłając wynik PNG do STDOUT ... ale po co?

Tytus
źródło
„Mógłbym zaoszczędzić jeszcze 9 bajtów, wysyłając wynik PNG do STDOUT ... ale po co?” Więc możesz uruchomić coś takiego php -r image.php image.png 1 > output.png, prawda?
ʰᵈˑ