Bir Görüntüyü “İzleyin”


9

Sorun:

Bu zorluk yaşadığım gerçek bir sorundan kaynaklanıyor. İş yerinde çift monitör kurulumum var ve aşağıdaki görüntüyü duvar kağıdı olarak kullanmak istedim:

İdeal Görüntü

Bununla birlikte, monitörlerimin oldukça önemli çerçeveleri var ve arka planımı ayarladığımda, iskelenin kırıldığı (şerefe?) Böyle bir şey görünüyor:

Sorun Resmi

Bunu, merkezi kesilmiş bir görüntü yaparak ve daha sonra aşağıdaki resimde olduğu gibi orijinal boyutuna geri uzatarak çözebildim:

Meydan Görüntüsü


Meydan okuma:

Bir görüntüyü alan ve bir çift monitör kurulumu ile kullanım için "izleyen" bir program yazın (yani, çerçevelerin bulunduğu görüntünün orta bölümünü siler). Kurallar aşağıdaki gibidir:

  1. Görüntüyü bir yol (dize bağımsız değişkeni vb.) Olarak veya bir dosya seçici iletişim kutusu biçiminde kabul eden tam bir program olmalıdır.
  2. Program, görüntünün merkezinden kırpmak için dikey çizgi sayısını (bir piksel genişliğinde) girdi olarak almalıdır.
  3. Kırpma, orijinal görüntünün merkezinden (genişlik bakımından) gelmelidir
  4. Ortaya çıkan görüntü, giriş görüntüsünün orijinal boyutuna geri ölçeklendirilmelidir. (Ya yarılar ayrı ayrı ölçeklenebilir ve sonra birleştirilebilir veya birleştirilebilir ve sonra ölçeklendirilebilir. Bireysel olarak ölçeklendirmek daha iyi bir görüntü / efekt üretir, ancak gerçek dünyada neredeyse hiç fark edilmez)
  5. Arka plan görüntüleri genellikle eşittir, bu nedenle bu meydan okumayı kolaylaştırmak için giriş görüntülerinin yalnızca çift sayıda pikseli olur ve kaldırılacak satır sayısı da yalnızca çift olur.
  6. Bu zorluk kod golf - bayt en kısa kod kazanır

İyi şanslar!


2
1. Aynı genişliğe ölçeklendirildikleri için işlemin ne olduğu resimlerden çok net değil. Belki ilk ve sonuncuyu, ortadaki ile aynı boyutta ve beyazla doldurulmuş resimlerle değiştirebilir misiniz? 2. Herhangi bir yeniden ölçekleme biçimini kullanabilir miyiz (doğrusal muhtemelen en ucuzudur) ya da belirli bir tane olması gerekir mi (örneğin kübik, samimi, vs.)?
Peter Taylor

@PeterTaylor Kural 3'e göre, giriş ve çıkış görüntülerinin aynı genişlikte olması gerekir. Her yarı orijinal genişliğinin yarısına kadar yeniden boyutlandırılır ve sonra birleştirilir veya kırpılan yarılar birleştirilir, ardından orijinal boyutuna geri ölçeklenir. Ve evet, herhangi bir ölçekleme iyidir.
dberm22

"Belki" ile başlayan cümle, sorunun meydan okumayı önerdiği bir yorum değil, sorunun nasıl anlaşılmasını kolaylaştıracağına dair bir öneriydi. Değişikliği kendim yaptım.
Peter Taylor

@PeterTaylor Ahh, anlıyorum, bu daha açık hale getiriyor. Teşekkürler.
dberm22

Görüntünün yatay yönde olacağını varsayabilir miyiz?
Scott Milner

Yanıtlar:


1

Oktav, 85 bayt

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

fDosya adı ve nkaldırılacak sütun sayısı ile anonim bir işlev tanımlar . Anonim bir işlev tek bir ifade gerektirdiğinden, MATLAB'da bulunmayan bir özellik satır içi atama kullanılır.

MATLAB, 98 bayt

Bir bonus olarak, MATLAB uyumlu bir cevap da golf oynadım. İlginçtir, bu sadece 13 bayt daha uzun, çünkü Octave sürümü satır içi atamaları doğru şekilde ayrıştırmak için çok sayıda parantez gerekiyor.

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 bayt

İşte Matlab'daki girişimim. Kesinlikle en kısa kod olmayacak, ama bu bir başlangıç.

Uyarı, bu orijinal görüntünün üzerine yazar, bu yüzden önce bir kopya oluşturun.

Golf Sürümü

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

Tekli resim boyutları ve tek sayıda sütun için iyileştirmelerle birlikte Açık Kod

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

Sadece buna ek olarak: zorluklara verilen cevaplar, verilen puanlama ölçütünü optimize etmek için ciddi bir girişimde bulunmalıdır. Bunun gibi bir kod golf mücadelesinde, kodun uzunluğunu azaltacak herhangi bir belirgin iyileştirme yapılması gerektiği anlamına gelir.

Kullanılmayan boşlukları ve boşlukları kaldırmayı deneyin.
dkudriavtsev

@ ais523 Teşekkürler. 220 bayta kadar!
dberm22

Ayrıca, her iki baytlık değişken çok fazladır. Okunabilirlik önemli değildir, bu yüzden osalfabedeki diğer harflere refactor vb. Ve neden fbütünü kurtarmak için sadece görüntüyü giriş görüntüsüne geri yazmıyorsunuz strcat? (bu arada, yerine ['',...]yerine değiştirebilirsiniz strcat(...))
Sanchises

@Sanchises Teşekkürler, bu ungolfed / geliştirilmiş sürümünden bir artık oldu. Kurallardaki hiçbir şey, üzerine yazılamayacağını veya oldukça adlandırılmış çıktılara sahip olması gerektiğini belirtmedi. Teşekkürler ... bayt sayısını 70 bayt azaltan!
dberm22

3

Wolfram Dili, 134 , 127 , 119111 bayt

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

fGörüntüyü ilk girdi (Mathematica veya Wolfram Cloud'da bir sembol olarak) ve ikinci girdi olarak bir tam sayı alan bir işlev oluşturur .

Kurtulmamış :

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

Teknik olarak, görüntü boyutlarından herhangi biri 362.880 pikseli aşarsa düzgün çalışmaz, ancak bunun iyi olduğunu varsayıyorum, çünkü bu sorunun kapsamının (ve bazı bilgisayarların) dışında. Sabit!


2

PHP, 206 bayt

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

üç komut satırı bağımsız değişkeni alır: kaynak dosya adı, kırpılacak satır sayısı ve hedef dosya adı. İle çalıştırın -r.

Daha iyi bir sonuç için (+2 bayt) imagecopyresampledyerine kullanmak isteyebilirsiniz imagecopyresized.

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

PNG sonucunu STDOUT'a göndererek 9 bayt daha kaydedebilirim ... ama ne için?


"PNG sonucunu STDOUT'a göndererek 9 bayt daha kaydedebilirim ... ama ne için?" O zaman böyle bir şey yapabilirdin php -r image.php image.png 1 > output.png, değil mi?
ʰᵈˑ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.