“ ตรวจสอบ” ภาพ


9

ปัญหา:

ความท้าทายนี้มาจากปัญหาจริงที่ฉันมี ฉันมีการตั้งค่าจอภาพสองจอในที่ทำงานและฉันต้องการใช้ภาพต่อไปนี้เป็นวอลล์เปเปอร์ของฉัน:

รูปภาพในอุดมคติ

อย่างไรก็ตามจอมอนิเตอร์ของฉันมีเบ็ซแซลค่อนข้างสำคัญและเมื่อฉันตั้งค่าพื้นหลังของฉันมันจะเป็นแบบนี้ที่ซึ่งท่าเรือปรากฏ (แอปพลิเคชัน?) จะแตก:

รูปภาพของปัญหา

ฉันสามารถแก้ปัญหานี้ได้ด้วยการสร้างภาพโดยที่จุดศูนย์กลางตัดออกแล้วยืดกลับไปเป็นขนาดดั้งเดิมตามที่แสดงในภาพด้านล่าง:

ภาพท้าทาย


ความท้าทาย:

เขียนโปรแกรมที่ถ่ายภาพและ "ตรวจสอบ" เพื่อใช้กับการตั้งค่าจอภาพสองจอ (เช่นลบส่วนตรงกลางของภาพที่มีเบแซลอยู่) กฎมีดังนี้:

  1. ต้องเป็นโปรแกรมเต็มรูปแบบที่ยอมรับรูปภาพไม่ว่าจะเป็นพา ธ (อาร์กิวเมนต์สตริง ฯลฯ ) หรือในรูปแบบของกล่องโต้ตอบตัวเลือกไฟล์
  2. โปรแกรมจะต้องป้อนข้อมูลเป็นจำนวนเส้นแนวตั้ง (ความกว้างหนึ่งพิกเซล) เพื่อครอบตัดออกจากกึ่งกลางของภาพ
  3. การปลูกพืชจะต้องมาจากศูนย์กลาง (กว้างไวด์) ของภาพต้นฉบับ
  4. รูปภาพผลลัพธ์ต้องถูกปรับสัดส่วนกลับเป็นขนาดดั้งเดิมของภาพอินพุตอีกครั้ง (แบ่งครึ่งสามารถเป็นรายบุคคลและจากนั้นตัดแบ่งหรือตัดแบ่งแล้วปรับขนาดแล้วการปรับขนาดเป็นการสร้างภาพ / เอฟเฟกต์ที่ดีขึ้น แต่แทบจะไม่สังเกตเห็นได้ในโลกแห่งความเป็นจริง)
  5. โดยทั่วไปแล้วภาพพื้นหลังจะทำให้การท้าทายนี้ง่ายขึ้นรูปภาพอินพุตจะมีจำนวนพิกเซลเท่ากันและจำนวนบรรทัดที่จะลบก็จะเท่ากัน
  6. ความท้าทายนี้เป็นโค้ดกอล์ฟ - โค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ

โชคดี!


2
1. ไม่ชัดเจนจากภาพว่าการทำงานนั้นเป็นอย่างไรเนื่องจากมีการปรับให้มีความกว้างเท่ากัน บางทีอาจแทนที่ภาพแรกและภาพสุดท้ายด้วยภาพที่มีขนาดเท่ากันกับภาพที่อยู่ตรงกลางและเต็มไปด้วยสีขาว? 2. เราสามารถใช้การ rescaling ในรูปแบบใด (เชิงเส้นน่าจะถูกที่สุด) หรือต้องเป็นรูปแบบเฉพาะ (เช่นลูกบาศก์, sinc, ฯลฯ )?
Peter Taylor

@PeterTaylor ตามกฎ 3 รูปภาพอินพุตและเอาต์พุตควรมีความกว้างเท่ากัน แต่ละครึ่งจะถูกปรับขนาดให้เป็นครึ่งหนึ่งของความกว้างดั้งเดิมแล้วต่อกันหรือแบ่งครึ่งที่ถูกครอบตัดแล้วแบ่งส่วนแล้วปรับขนาดกลับเป็นขนาดดั้งเดิม และใช่การปรับสเกลใดก็ได้
dberm22

ประโยคที่เริ่มต้น "บางที" เป็นข้อเสนอแนะสำหรับวิธีทำให้คำถามง่ายต่อการเข้าใจไม่ใช่การตีความที่ท้าทาย ฉันเปลี่ยนแปลงตัวเองแล้ว
Peter Taylor

@ 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 ที่น่าสนใจนี้มีความยาวเพียง 13 ไบต์เนื่องจากรุ่น Octave ต้องการวงเล็บจำนวนมากเพื่อแยกวิเคราะห์การมอบหมายแบบอินไลน์อย่างถูกต้อง

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 แน่นอนว่าจะไม่ใช่รหัสที่สั้นที่สุด แต่เป็นการเริ่มต้น

คำเตือนการทำเช่นนี้จะเขียนทับภาพต้นฉบับดังนั้นควรทำสำเนาก่อน

เวอร์ชัน Golfed

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 พร้อมการปรับปรุงขนาดภาพคี่และจำนวนคอลัมน์คี่

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

นอกจากนี้ตัวแปรสองไบต์ทุกตัวมีค่ามากเกินไป การอ่านไม่สำคัญดังนั้น refactor osเป็นต้นสำหรับจดหมายอื่น ๆ ในตัวอักษร! และทำไมไม่เพียงแค่เขียนภาพกลับไปที่ภาพอินพุตfเพื่อบันทึกทั้งหมดstrcat? (ซึ่งบังเอิญคุณสามารถแทนที่โดย['',...]มากกว่าstrcat(...))
Sanchises

@Sanchises ขอบคุณที่เหลือจากรุ่น ungolfed / ปรับปรุง ไม่มีสิ่งใดในกฎที่ระบุว่าไม่สามารถเขียนทับหรือจำเป็นต้องมีชื่อที่ค่อนข้างสวย ขอบคุณ ... ที่ลดจำนวนไบต์ลง 70 ไบต์!
dberm22

3

ภาษา Wolfram, 134 , 127 , 119 111 ไบต์

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) และจำนวนเต็มเป็นอินพุตที่สอง

Ungolfed :

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ทำงานด้วย

คุณอาจต้องการใช้imagecopyresampledแทนimagecopyresized(+2 ไบต์) เพื่อผลลัพธ์ที่ดีขึ้น

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

ฉันสามารถบันทึกเพิ่มอีก 9 ไบต์ด้วยการส่งผลลัพธ์ PNG ไปยัง STDOUT ... แต่จะเป็นอย่างไร


"ฉันสามารถบันทึกเพิ่มอีก 9 ไบต์ได้โดยการส่งผลลัพธ์ PNG ไปยัง STDOUT ... แต่จะเป็นอย่างไร" จากนั้นคุณสามารถเรียกใช้บางสิ่งบางอย่างphp -r image.php image.png 1 > output.pngใช่มั้ย
ʰᵈˑ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.