"Monitor" sebuah Gambar

9

Masalah:

Tantangan ini datang dari masalah nyata yang saya alami. Saya memiliki pengaturan dual monitor di tempat kerja, dan saya ingin menggunakan gambar berikut sebagai wallpaper saya:

Gambar ideal

Namun, monitor saya memiliki bezel yang cukup signifikan, dan ketika saya mengatur latar belakang saya, terlihat seperti ini, di mana dermaga muncul (appiers?) Menjadi rusak:

Gambar Masalah

Saya dapat menyelesaikan ini dengan membuat gambar dengan bagian tengahnya terpotong, dan kemudian merentangkannya kembali ke ukuran aslinya, seperti pada gambar di bawah ini:

Gambar Tantangan


Tantangan:

Tulis program yang mengambil gambar dan "pantau" untuk digunakan dengan pengaturan dua monitor (yaitu menghapus bagian tengah gambar, di mana bezel berada). Aturannya adalah sebagai berikut:

  1. Ini harus berupa program lengkap yang menerima gambar, baik sebagai jalur (argumen string, dll), atau dalam bentuk dialog pemilih file.
  2. Program harus mengambil sebagai input jumlah garis vertikal (lebar satu piksel) untuk memotong dari bagian tengah gambar
  3. Pemangkasan harus berasal dari pusat (lebar-bijaksana) dari gambar asli
  4. Gambar yang dihasilkan harus diskalakan kembali ke ukuran asli dari gambar input. (Salah satu bagiannya dapat diskalakan secara individual, dan kemudian digabungkan, atau digabungkan dan kemudian diskalakan. Penskalaan secara individual menghasilkan gambar / efek yang lebih baik, tetapi hampir tidak terlihat di dunia nyata)
  5. Gambar latar belakang pada umumnya genap, sehingga untuk membuat tantangan ini lebih mudah, input gambar hanya akan memiliki jumlah piksel yang genap, dan jumlah garis untuk dihapus hanya akan sama rata.
  6. Tantangan ini adalah kode golf - kode terpendek dalam byte yang menang

Semoga berhasil!

dberm22
sumber
2
1. Tidak terlalu jelas dari gambar apa operasi itu, karena mereka diskalakan dengan lebar yang sama. Mungkin ganti yang pertama dan terakhir dengan gambar yang ukurannya sama dengan yang di tengah dan empuk dengan warna putih? 2. Bisakah kita menggunakan segala bentuk penyelamatan (linier mungkin termurah) atau harus spesifik (misalnya kubik, sinc, dll.)?
Peter Taylor
@PeterTaylor Sesuai aturan 3, gambar input dan output seharusnya memiliki lebar yang sama. Masing-masing setengahnya diubah ukurannya menjadi setengah dari lebar aslinya, dan kemudian digabungkan, atau potongan yang dipotong digabungkan, kemudian diskalakan kembali ke ukuran aslinya. Dan ya, skala apa pun baik-baik saja.
dberm22
Kalimat yang dimulai "Mungkin" adalah saran untuk bagaimana membuat pertanyaan lebih mudah untuk dipahami, bukan interpretasi yang disarankan dari tantangan. Saya telah membuat perubahan sendiri.
Peter Taylor
@PeterTaylor Ahh, saya mengerti, Itu membuatnya lebih jelas. Terima kasih.
dberm22
Bisakah kita berasumsi bahwa gambar akan berorientasi lanskap?
Scott Milner

Jawaban:

1

Oktaf, 85 byte

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

Menentukan fungsi anonim dengan fnama file, dan njumlah kolom yang akan dihapus. Karena fungsi anonim membutuhkan satu ekspresi, penugasan inline digunakan, fitur yang tidak ada di MATLAB.

MATLAB, 98 byte

Sebagai bonus, saya juga mengirim jawaban yang kompatibel dengan MATLAB. Menariknya, ini hanya 13 byte lebih lama, karena versi Oktaf membutuhkan banyak tanda kurung untuk mengurai tugas inline dengan benar.

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

Matlab 2013, 150 byte

Ini usaha saya di Matlab. Jelas bukan kode terpendek, tapi ini awal.

Peringatan, ini menimpa gambar asli, jadi buat salinannya terlebih dahulu.

Versi Golf

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 Code, dengan peningkatan untuk ukuran gambar ganjil dan jumlah kolom ganjil

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
sumber
Hanya menambahkan ini: jawaban untuk tantangan harus membuat upaya serius mengoptimalkan untuk kriteria penilaian yang diberikan. Dalam tantangan kode-golf seperti ini, itu berarti bahwa setiap perbaikan nyata yang akan mengurangi panjang kode harus dilakukan.
Coba hapus spasi dan spasi yang tidak digunakan.
dkudriavtsev
@ ais523 Terima kasih. Turun ke 220 byte!
dberm22
Juga, setiap variabel dua byte terlalu banyak. Keterbacaan tidak penting, jadi refactor osdll ke huruf lain dalam alfabet! Dan mengapa tidak hanya menulis gambar kembali ke gambar input funtuk menyimpan keseluruhan strcat? (yang, kebetulan, Anda dapat menggantikannya dengan ['',...]bukan strcat(...))
Sanchises
@Sanchises Terima kasih, itu adalah sisa dari versi ungolfed / ditingkatkan. Tidak ada dalam aturan yang menyatakan itu tidak bisa ditimpa, atau perlu memiliki keluaran yang cukup bernama. Terima kasih ... jumlah byte yang berkurang sebesar 70 byte!
dberm22
3

Bahasa Wolfram, 134 , 127 , 119 111 byte

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

Membuat fungsi fyang mengambil gambar sebagai input pertama (sebagai simbol dalam Mathematica atau Wolfram Cloud), dan integer sebagai input kedua.

Tidak disatukan :

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

Secara teknis, itu tidak akan berfungsi dengan baik jika salah satu dari dimensi gambar melebihi 362.880 piksel, tapi saya berasumsi tidak apa-apa, karena itu jauh di luar lingkup masalah (dan beberapa komputer). Tetap!

Scott Milner
sumber
2

PHP, 206 byte

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

membutuhkan tiga argumen baris perintah: nama file sumber, jumlah baris untuk dipangkas, dan nama file target. Jalankan dengan -r.

Anda mungkin ingin menggunakan imagecopyresampledsebagai ganti imagecopyresized(+2 byte) untuk hasil yang lebih baik.

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

Saya bisa menghemat 9 byte lagi dengan mengirim hasil PNG ke STDOUT ... tapi untuk apa?

Titus
sumber
"Saya bisa menghemat 9 byte lagi dengan mengirimkan hasil PNG ke STDOUT ... tapi untuk apa?" Maka Anda bisa menjalankan sesuatu seperti php -r image.php image.png 1 > output.png, kan?
ʰᵈˑ