সাফল্যের ক্রোমা কী


23

আরজিবি রঙ মানটি #00FF00বরং একটি গুরুত্বপূর্ণ: এটি চলচ্চিত্র, টিভি শো, আবহাওয়ার ঘোষণা এবং আরও অনেক কিছু তৈরি করতে ব্যবহৃত হয়। এটি বিখ্যাত "টিভি সবুজ" বা "সবুজ স্ক্রিন" রঙ।

চ্যালেঞ্জ

আপনার কাজটি এমন একটি প্রোগ্রাম লিখতে হবে যা দুটি ইনপুট চিত্র গ্রহণ করে, উভয়ই পিএনজি ফর্ম্যাটে (বা আপনার চিত্র গ্রন্থাগারের ইমেজ অবজেক্টের ধরণে) এবং একই মাত্রা। একটি চিত্র যে কোনও পুরানো চিত্র হতে পারে। অন্যটি চিত্র রং এর একটি ব্যাকগ্রাউন্ড থাকবে #00FF00। আউটপুট চিত্রটিতে দ্বিতীয় চিত্রটি প্রথমটিতে ওভারলাইডযুক্ত থাকবে, এতে কোনও #00FF00রঙ উপস্থিত নেই (প্রথম চিত্র ব্যতীত)। ইনপুট এবং আউটপুট, ফাইল, একটি GUI, ইত্যাদি আপনি ইনপুট হিসাবে আরজিবি মূল্যবোধের একটি অ্যারের নিতে পারে সঙ্গে সম্পন্ন করা যেতে পারে হিসাবে দেখা এখানে । আপনি ধরে নিতে পারেন যে কোনও চিত্রের মধ্যে কেবলমাত্র পিক্সেল সম্পূর্ণ অস্বচ্ছ।

মূলত ...

এমন একটি প্রোগ্রাম তৈরি করুন যা প্রতিটি #00FF00চিত্রকে এক চিত্রে নিয়ে যায় এবং এটি ব্যাকগ্রাউন্ড চিত্রের সাথে সম্পর্কিত পিক্সেলের সাথে প্রতিস্থাপন করে।

পরীক্ষার মামলা

@ Dzaima দ্বারা উদারভাবে সরবরাহ করা: পটভূমি: সম্মুখভাগ : আউটপুট:
আমার প্রোফাইল ইমেজ

ডেনিস

আউটপুট


অবশ্যই, স্ট্যান্ডার্ড লুফোলগুলি কঠোরভাবে নিষিদ্ধ । এটি আপনার জন্য এটি করার জন্য একটি অনলাইন সংস্থান ব্যবহার করে।
এটি , তাই সংক্ষিপ্ততম কোড জিততে পারে এবং সেরা প্রোগ্রামার উন্নতি করতে পারে ...


2
আমরা কী ভাষা / গ্রন্থাগারের আদি বিন্যাসে ইনপুট হিসাবে কোনও চিত্র বস্তু নিতে পারি, বা আমাদের ফাইলনামের মাধ্যমে চিত্রটি পড়তে হবে?
নটজাগান

@ নোটজাগান আপনি চিত্রের বিষয়গুলি ইনপুট হিসাবে নিতে পারেন।
ckjbgames

3
পূর্ণসংখ্যার অ্যারেগুলির অ্যারেগুলির I / O গ্রহণযোগ্য কি আমরা আসলে চিত্র / I / O- র কিছু সেটের মধ্যে সীমাবদ্ধ?
জোনাথন অ্যালান

1
@ পিটারকার্ডস আমি এটির অনুমতি দেব।
ckjbgames

1
@ পিটারকর্ডস ঠিক আছে
ckjbgames

উত্তর:


14

x86-64 (এবং x86-32) মেশিন কোড, 13 15 13 বাইট

পরিবর্তণের:

  1. বাগফিক্স: প্রথম সংস্করণটি কেবলমাত্র জি = 0 এক্সএফ পরীক্ষা করছে, আর আর বি-তে 0 হওয়ার দরকার নেই, আমি স্থানটিতে পটভূমিটি পরিবর্তন করেছি যাতে শর্ট-ফর্ম এনকোডিংয়ের জন্য আমি lodsdফোর পিক্সেল রাখতে পারি (5 বাইট) ) এর পরিবর্তে (3 বাইট)eaxcmp eax, imm32cmp dh,0xff

  2. 2 বাইট সংরক্ষণ করুন: লক্ষ্য করেছেন যে জায়গায় বিজি সংশোধন করার জন্য মেমরি অপারেন্ড ব্যবহারের অনুমতি দেওয়া হয়েছে cmov, একটি 2-বাইট movলোড সংরক্ষণ করা (এবং কোনও ক্ষেত্রে নিবন্ধক সংরক্ষণ করা উচিত)।


এটি x86-64 সিস্টেম ভি কলিং কনভেনশন অনুসরণ করে যা এই সিগনেচারের মাধ্যমে সরাসরি সি বা সি ++ (x86-64 নন-উইন্ডোজ সিস্টেমে) থেকে কলযোগ্য:

void chromakey_blend_RGB32(uint32_t *background /*rdi*/,
                     const uint32_t *foreground /*rsi*/,
                  int dummy, size_t pixel_count /*rcx*/);

চিত্রের ফর্ম্যাটটি আরজিবি0 32 বিপিপি, প্রতিটি পিক্সেলের মধ্যে দ্বিতীয় সর্বনিম্ন মেমরি ঠিকানার সবুজ উপাদান সহ component ফোরগ্রাউন্ড পটভূমি চিত্র ইন-জায়গা রুপান্তরিত করা হয়েছে। pixel_countসারি * কলামগুলি। এটি সারি / কলামগুলি সম্পর্কে চিন্তা করে না; এটি কেবল ক্রোমিকি মিশ্রিত করে তবে আপনি উল্লেখ করেছেন মেমরির অনেকগুলি ডিফল্ট।

আরজিবিএ (0xFF হওয়া আবশ্যক সহ) এর জন্য একটি ভিন্ন ধ্রুবক ব্যবহার করা প্রয়োজন, তবে ফাংশনের আকারে কোনও পরিবর্তন করা দরকার। ফোরগ্রাউন্ড DWORD গুলি 4 বাইটে সঞ্চিত 32-বিট ধ্রুবকের বিপরীতে নির্ভুল সমতার জন্য তুলনা করা হয়, যাতে কোনও পিক্সেল-অর্ডার বা ক্রোমা-কী রঙ সহজেই সমর্থন করা যায়।

একই মেশিন কোডটি 32-বিট মোডেও কাজ করে। 32-বিট হিসাবে একত্রিত rdiহতে ediউত্সে পরিবর্তন করুন । All৪-বিট হয়ে যাওয়া অন্যান্য সমস্ত নিবন্ধগুলি অন্তর্ভুক্ত (লজড / স্টোসড এবং লুপ), এবং অন্যান্য স্পষ্টত রেজিগুলি 32-বিট থাকে। তবে মনে রাখবেন যে আপনাকে 32-বিট সি থেকে কল করার জন্য একটি মোড়কের দরকার হবে, কারণ স্ট্যান্ডার্ড x86-32 কলিং কনভেনশনগুলির কোনওটিই x86-64 SysV হিসাবে একই রেগ ব্যবহার করে না।

এনএএসএম তালিকা (মেশিন-কোড + উত্স), আরও জটিল নির্দেশাবলী কী করে তার বিবরণ সহ asm প্রবর্তকদের জন্য মন্তব্য করেছে। (নির্দেশের রেফারেন্স ম্যানুয়ালটি সদৃশ করা সাধারণ ব্যবহারে খারাপ স্টাইল)

 1                       ;; inputs:
 2                       ;; Background image pointed to by RDI, RGB0 format  (32bpp)
 3                       ;; Foreground image pointed to by RSI, RGBA or RGBx (32bpp)
 4          machine      ;; Pixel count in RCX
 5          code         global chromakey_blend_RGB32
 6          bytes        chromakey_blend_RGB32:
 7 address               .loop:                      ;do {
 8 00000000 AD               lodsd                   ; eax=[rsi], esi+=4. load fg++
 9 00000001 3D00FF0000       cmp    eax, 0x0000ff00  ; check for chromakey
10 00000006 0F4407           cmove  eax, [rdi]       ; eax = (fg==key) ? bg : fg
11 00000009 AB               stosd                   ; [rdi]=eax, edi+=4. store into bg++
12 0000000A E2F4             loop .loop              ;} while(--rcx)
13                       
14 0000000C C3               ret

##  next byte starts at 0x0D, function length is 0xD = 13 bytes

এই তালিকা থেকে মূল এনএএসএম উত্সটি পেতে, প্রতিটি লাইনের নেতৃস্থানীয় 26 টি অক্ষর দিয়ে স্ট্রিপ করুন <chromakey.lst cut -b 26- > chromakey.asm। আমি এটি
nasm -felf64 chromakey-blend.asm -l /dev/stdout | cut -b -28,$((28+12))- NASM তালিকাগুলি দিয়ে তৈরি করেছিলাম মেশিন-কোড এবং উত্সের মধ্যে আমার চেয়ে বেশি ফাঁকা কলামগুলি ছেড়ে যায়। কোনও অবজেক্ট ফাইল তৈরি করতে আপনি সি বা সি ++ এর সাথে লিঙ্ক করতে পারেন, ব্যবহার করুন nasm -felf64 chromakey.asm। (বা yasm -felf64 chromakey.asm)

অরক্ষিত , তবে আমি যথেষ্ট আত্মবিশ্বাসী যে লোড / লোড / সেন্টিমোভ / স্টোরের প্রাথমিক ধারণাটি দুর্দান্ত, কারণ এটি খুব সহজ।

আমি কলকারীর ক্রিয়াকলাপটির মধ্যে ধ্রুবককে হার্ড-কোডিংয়ের পরিবর্তে অতিরিক্ত আরগ হিসাবে ক্রোমা-কি ধ্রুবক (0x00ff00) পাস করার প্রয়োজন হলে আমি 3 বাইট সংরক্ষণ করতে পারতাম। আমি মনে করি না যে সাধারণ নিয়মগুলি আরও জেনেরিক ফাংশন লেখার মঞ্জুরি দেয় যার জন্য কলার সেট আপ করার ধ্রুবক থাকে। তবে যদি তা হয় তবে তৃতীয় আরগটি (বর্তমানে dummy) edxx86-64 SysV ABI তে পাস করা হবে । কেবল cmp eax, 0x0000ff00(5 বি) থেকে cmp eax, edx(2 বি) পরিবর্তন করুন ।


এসএসই 4 বা এভিএক্সের সাহায্যে আপনি তুলনা মুখোশ দ্বারা নিয়ন্ত্রিত 32-বিট উপাদান আকারের ভেরিয়েবল-মিশ্রণটি দিয়ে pcmpeqdএবং এটি blendvpsকরতে দ্রুত (তবে বৃহত্তর কোড আকার) করতে পারেন। (এর সাথে pand, আপনি হাই বাইট উপেক্ষা করতে পারেন)। প্যাক করা আরজিবি ২৪ এর জন্য, আপনি সম্ভবত pcmpeqb2x pshufb+ ব্যবহার করতে পারেন pandযেখানে বাইটে সত্য পেতে সেখানে p পিক্সেলের সমস্ত 3 উপাদান মিলে যায় pblendvb

(আমি জানি এটি কোড-গল্ফ, তবে স্কেলারের পূর্ণসংখ্যার সাথে যাওয়ার আগে আমি এমএমএক্স চেষ্টা করার বিষয়টি বিবেচনা করেছি))


আপনি কি আমাকে এই মেশিন কোড দিয়ে একটি এক্সিকিউটেবল পাঠাতে পারবেন?
ckjbgames

x86_32, দয়া করে।
ckjbgames

@ কেজবিগেমস: আমি কোনও কলার লিখিনি যা চিত্রগুলি লোড / সেভ করে, কেবলমাত্র পিক্সেল-ইন-প্লেস অংশ। এক্সিকিউটেবল গড়ার কোনও ধারণা তৈরি করার আগে আমার তা করতে হবে। তবে আমি যদি করতাম, তাহলে কী ধরনের এক্সিকিউটেবল? উইন্ডোজ পিই 32? লিনাক্স ইএলএফ 32? FreeBSD 'র ??
পিটার কর্ডেস

ELF32, যদি আপনি চান।
ckjbgames

@ কেজবিগেমস: আমি যদি সময় পাই তবে আমি একটি চিত্র-লোডিং লাইব্রেরি সন্ধান করব এবং কিছু লিখব। আপনি তালিকাটি কীভাবে কোডগুলিতে একত্রিত করতে পারেন সেই পদ্ধতিতে কীভাবে পরিবর্তন করবেন সে সম্পর্কে আমি একটি অনুচ্ছেদ যুক্ত করেছি nasm -felf32। (32-বিটের জন্য, আপনাকে সি থেকে কল করার জন্য একটি মোড়ক ফাংশনও প্রয়োজন, কারণ এটি এখনও x86-64 এসআইএসবি এবিআইয়ের মতো একই রেজিস্টারগুলি ব্যবহার করে))
পিটার

13

গণিত 57 35 বাইট

আপডেট: ডিফল্টরূপে, একটি সবুজ পটভূমি ব্যবহার করে সরানো হয় RemoveBackground। প্রথম জমা দেওয়ার মধ্যে অপ্রয়োজনীয় দ্বিতীয় প্যারামিটার, `Back" পটভূমি ", সবুজ}" অন্তর্ভুক্ত।


#~ImageCompose~RemoveBackground@#2&

চিত্র 2 এর পটভূমি সরিয়ে দেয় এবং চিত্র 1 এর সাথে ফলাফলটি রচনা করে।


উদাহরণ

i1

নিম্নলিখিতটি ইনফিক্স ফর্মের পরিবর্তে উপসর্গে কোডটি কীভাবে কাজ করে তা আরও স্পষ্টভাবে দেখায়।

I2


4
এটি কি এমন চিত্রগুলির জন্য কাজ করবে যেখানে এটি সবুজ "পটভূমি" নয়? (আপনার আউটপুটটিতে সবুজ রঙের একটি ছোট প্যাচ রয়েছে বলে মনে হয়)
ডিবিএস

ছবিতে যদি কোনও সবুজ "দ্বীপ" থাকে, তবে অতিরিক্ত প্যারামিটার, {{"ব্যাকগ্রাউন্ড", সবুজ} "প্রয়োজন হবে, যা মোট 57 বাইটে বাড়িয়ে দেবে That এটি ছিল আমার প্রথম জমা। কারণ আমি কোনও সবুজ দেখি না Because ছবির অগ্রভাগে বিচ্ছিন্ন হয়ে সেই প্যারামিটারটি বাদ দেওয়া হয়েছিল
ডেভিডসি

11

পাইথন 3 + নম্পি , 59 বাইট

lambda f,b:copyto(f,b,'no',f==[0,255,0])
from numpy import*

এটি অনলাইন চেষ্টা করুন!

ইনপুট একটি numpyঅ্যারের বিন্যাসে দেওয়া হয় , পিক্সেল উপস্থাপনা পূর্ণসংখ্যার ট্রিপল্ট সহ (যেখানে #00FF00হেক্স রঙের কোডের সমতুল্য [0, 255, 0])। ইনপুট অ্যারেটি পরিবর্তিত হয়েছে, যা প্রতি মেটাতে অনুমোদিত ।

উদাহরণ চিত্র

ইনপুট (প্রশ্ন থেকে)

পটভূমি:

ckjbgames এর প্রোফাইল ছবি

ফোরগ্রাউন্ড:

ডেনিসের প্রোফাইল ছবি

ফাংশনটি চালানোর পরে অগ্রভাগের চিত্র:

# 00FF00 এর সাথে চিত্রটি মার্জ করা ব্যাকগ্রাউন্ড পিক্সেলের সাথে প্রতিস্থাপিত হয়েছে

রেফারেন্স বাস্তবায়ন ( opencvচিত্র ফাইল পড়তে ব্যবহার করে)

g = lambda f,b:copyto(f,b,'no',f==[0,255,0])
from numpy import*

import cv2

f = cv2.imread("fg.png")
b = cv2.imread("bg.png")

g(f, b)

cv2.imshow("Output", f)
cv2.imwrite("out.png", f)

চিত্রটি স্ক্রিনে প্রদর্শন করে এবং একটি আউটপুট ফাইলে এটি লেখায়।


17
ফলস্বরূপ ইমেজের সমস্ত লাল বিন্দুর কী আছে?
ইয়াতসি

1
আমি I / O সম্পর্কে জিজ্ঞাসা করেছি - এটি বর্তমান শব্দ (যেমন "আপনার গ্রন্থাগার") মেনে চলেছে বলে মনে হয়, যদি তাই হয়, সিভি 2 নিজেই কি অদ্ভুত আমদানির প্রয়োজন? যদি তা না হয় যদি আপনি কোন numpy ফাংশন ব্যবহার করে না এবং numpy আমদানি না করে 54-এ এটা করতে পারে: lambda f,b:[x[list(x[0])==[0,255,0]]for x in zip(f,b)]। পূর্ণসংখ্যার তালিকাগুলির তালিকাটি যদি সত্যই গ্রহণযোগ্য হয় তবে আপনি 48 এর সাথে এটি করতে পারতেনlambda f,b:[x[x[0]==[0,255,0]]for x in zip(f,b)]
জোনাথন অ্যালান

.. সত্যিকার অর্থে সিভি 2 এর রূপান্তর সম্পাদনের জন্য যদি আড়ম্বরপূর্ণ প্রয়োজন হয় তবে আমি এখনও মনে করি আপনি 54 বাইট সংস্করণটি করতে পারেন, কারণ আমাদের চ্যালেঞ্জের জন্য সিভি 2 আমদানির দরকার নেই।
জোনাথন অ্যালান

5
যদি G == 255, আর এবং বি শূন্য না হয় তবে মানগুলি প্রতিস্থাপিত হয় যা লাল বিন্দুতে ডেকে আনে। এটি অন্যান্য ব্যান্ডগুলির পক্ষেও শক্ত যে এটি কম দেখা যায়। সুতরাং এটি একে অপরের স্বতন্ত্রভাবে লজিক চেকগুলি সম্পাদন করে এবং কেবলমাত্র শর্তগুলির মধ্যে একটি পূরণ করা হলেও একক চ্যানেলগুলি অদলবদল করে। যেমন একটি পিক্সেল [0 255 37]হলে লাল এবং সবুজ ব্যান্ডগুলি প্রতিস্থাপন করা হবে।
লিয়ান্ডার মোসিংগার

2
@ লিন্ডারমোসিঞ্জার: ভাল দাগযুক্ত। আমার মধ্যেও এই বাগটি ছিল> আইডিকে কেন আমি ভেবেছিলাম যে আর আর বি উপেক্ষা করার সময় কেবল সবুজ = 0xFF পরীক্ষা করা সঠিক ছিল!
পিটার কর্ডেস

9

প্রক্রিয়াজাতকরণ, 116 99 বাইট

PImage f(PImage b,PImage f){int i=0;for(int c:f.pixels){if(c!=#00FF00)b.pixels[i]=c;i++;}return b;}

দুর্ভাগ্যক্রমে, প্রক্রিয়াজাতকরণ জাভা 8 টি স্টাফ যেমন ল্যাম্বডাসকে সমর্থন করে না।

উদাহরণ প্রয়োগের: (চিত্রটিকে সেভ করে out.pngএবং এটি স্ক্রিনেও আঁকায়)

PImage bg;
void settings() {
  bg = loadImage("bg.png");
  size(bg.width,bg.height);
}
void setup() {
  image(f(bg, loadImage("fg.png")), 0, 0);
  save("out.png");
}
PImage f(PImage b,PImage f){int i=0;for(int c:f.pixels){if(c!=#00FF00)b.pixels[i]=c;i++;}return b;}

আপনি settings()এবং setup()কার্যগুলি থেকে মুক্তি পেতে পারেন এবং কেবল কোডটি সরাসরি চালাতে পারেন।
কেভিন কর্মী

@ কেভিন ওয়ার্কম্যান আমার সেখানে সেটিংস এবং সেটআপ আছে তাই এটি চিত্রটি পর্দায় প্রদর্শিত হবে যা অন্যথায় সম্ভব হবে না
dਜাইমা

কি #ff00বা 0xff00হিসাবে একই #00ff00প্রসেসিং মধ্যে?
পিটার কর্ডেস

@ পিটারকার্ডস # এফএফ 100 সিনফ্যাক্স ত্রুটি করে, দুঃখের সাথে এবং # 00FF00 == 0xFF00FF00 দেয়, সুতরাং 0xFF00 আলফা মান 0
dਜাইমা

@জাইমা: আপনি কি নিজের ছবিগুলি আরজিবি0 ফর্ম্যাটে নিতে পারবেন, তাই 0x0000FF00আপনি কী বিট-প্যাটার্নটি সন্ধান করছেন?
পিটার কর্ডেস

6

বাশ + চিত্রম্যাগিক, 45 বাইট

convert $1 $2 -transparent lime -composite x:

দুটি চিত্রকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং স্ক্রিনে আউটপুট প্রদর্শন করে। পরিবর্তন x:করার জন্য $3এর পরিবর্তে একটি তৃতীয় ফাইল যুক্তি লিখতে। পদ্ধতিটি সহজ: "ব্যাকগ্রাউন্ড" চিত্রটি পড়ুন; "অগ্রভাগ" চিত্র পড়ুন; "চুন" (# 00ff00) রঙটিকে দ্বিতীয় চিত্রটিতে স্বচ্ছতা হিসাবে পুনরায় ব্যাখ্যা করুন; তারপরে প্রথম এবং আউটপুটে দ্বিতীয় চিত্রটি মিশ্রিত করুন।

চিত্রম্যাগিক: 28 বাইট?

আমি এটি একটি ইমেজম্যাগিক উত্তর হিসাবে জমা দিতে পারতাম তবে তর্কগুলি কীভাবে মোকাবেলা করা যায় তা পরিষ্কার নয়। আপনি যদি চিত্রিত করতে চান যে চিত্রম্যাগিকটি একটি স্ট্যাক-ভিত্তিক ভাষা (যা কিছুটা সত্যই সত্য নয় তবে প্রায় অদ্ভুত) তবে -transparent lime -compositeএটি একটি ফাংশন যা স্ট্যাকের উপর দুটি চিত্র প্রত্যাশা করে এবং স্ট্যাকের উপর একটি মার্জ হওয়া চিত্র ছেড়ে দেয় .. সম্ভবত এটি গণনা করার পক্ষে যথেষ্ট?


3

এমএটিএল , 40 37 31 বাইট

,jYio255/]tFTF1&!-&3a*5M~b*+3YG

উদাহরণ অফলাইন দোভাষী সাথে চালানো। চিত্রগুলি তাদের ইউআরএল দ্বারা ইনপুট হয় (স্থানীয় ফাইলের নামও সরবরাহ করা যেতে পারে)।

এখানে চিত্র বর্ণনা লিখুন

ব্যাখ্যা

,        % Do this twice
  j      %   Input string with URL or filename
  Yi     %   Read image as an M×N×3 uint8 array
  o      %  Convert to double
  255/   %   Divide by 255
]        % End
t        % Duplicate the second image
FTF      % Push 1×3 vector [0 1 0]
1&!      % Permute dimensions to give a 1×1×3 vector
-        % Subtract from the second image (M×N×3 array), with broadcast
&3a      % "Any" along 3rd dim. This gives a M×N mask that contains
         % 0 for pure green and 1 for other colours
*        % Mulltiply. This sets green pixels to zero
5M       % Push mask M×N again
~        % Negate
b        % Bubble up the first image
*        % Multiply. This sets non-green pixels to zero
+        % Add the two images
3YG      % Show image in a window

3

পাইথ , 27 বাইট

M?q(Z255Z)GHG.wmgVhded,V'E'

এটি উদ্ধৃত ইনপুট নেয়। ইনপুটটি ইমেজ ফাইলগুলির দুটি পাথ। কোনও ফাইল আউটপুট করুন o.pngদুর্ভাগ্যক্রমে যেটিকে সুরক্ষা কারণে অনলাইন দোভাষীতে পরীক্ষা করা যায় না ( 'এটি এতে অক্ষম রয়েছে)। এটি পরীক্ষা করার জন্য আপনার কম্পিউটারে পাইথটি পেতে হবে।

ব্যাখ্যা

M?q(Z255Z)GHG                  # Define a function g which takes two tuples G and H and returns G if G != (0, 255, 0), H otherwise
                       V'E'    # Read the images. They are returned as lists of lists of colour tuples
                      ,        # Zip both images
               m  hded         # For each couple of lists in the zipped list...
                gV             # Zip the lists using the function g
             .w                # Write the resulting image to o.png

ক্রোমা-কি মিশ্রণের ক্রিয়াকলাপটি আমার নিজের এক্স 86 মেশিন-কোড উত্তরের মতো 13 বাইট is আমি আগে বুঝতে পারি নি যে এটি I / O পাশাপাশি সম্পূর্ণ প্রোগ্রাম হস্তান্তর করা হয়েছে।
পিটার কর্ডেস

2

মতলব 2016 বি এবং অকটাভ, 62 59 বাইট

ইনপুট: এ = এমএক্সএনএক্স 3 ইউনিট 8 ফোরগ্রাউন্ড ম্যাট্রিক্স, বি = এমএক্সএনএক্স 3 ইউনিট 8 ব্যাকগ্রাউন্ড ম্যাট্রিক্স।

k=sum(A(:,:,2)-A(:,:,[1 3]),3)==510.*ones(1,1,3);A(k)=B(k);

আউটপুট: A = MxNx3 ইউনিট 8 ম্যাট্রিক্স

নমুনা ব্যবহার:

A = imread('foreground.png');
B = imread('backgroundimg.png');

k=sum(A(:,:,2)-A(:,:,[1 3]),3)==510.*ones(1,1,3);A(k)=B(k);

imshow(A)

1

সি ++, 339 বাইট

এটি সিআইএমজি ব্যবহার করে এবং এটি অন্যান্য ফর্ম্যাটে ফাইলও নিতে পারে। ফলাফলটি একটি উইন্ডোতে প্রদর্শিত হয়।

#include<CImg.h>
using namespace cimg_library;
int main(int g,char** v){CImg<unsigned char> f(v[1]),b(v[2]);for(int c=0;c<f.width();c++){for(int r=0;r<f.height();r++){if((f(c,r)==0)&&(f(c,r,0,1)==255)&&(f(c,r,0,2)==0)){f(c,r)=b(c,r);f(c,r,0,1)=b(c,r,0,1);f(c,r,0,2) = b(c,r,0,2);}}}CImgDisplay dis(f);while(!dis.is_closed()){dis.wait();}}

সঙ্গে সংকলন g++ chromakey.cpp -g -L/usr/lib/i386-linux-gnu -lX11 -o chromakey -pthread


1

আর, 135 বাইট

function(x,y,r=png::readPNG){a=r(x);m=apply(a,1:2,function(x)all(x==0:1));for(i in 1:4)a[,,i][m]=r(y)[,,i][m];png::writePNG(a,"a.png")}

বেনামে ফাংশন, আর্গুমেন্ট হিসাবে 2 পিএনজি ফাইল পাথ নেয় এবং নামক একটি পিএনজি ছবি আউটপুট দেয় a.png

কিছুটা ব্যাখ্যা না দিয়ে কিছুটা দালালি করা:

function(x,y){
    library(png)
    # readPNG output a 3D array corresponding to RGBA values on a [0,1] scale:
    a = readPNG(x)
    # Logical mask, telling which pixel is equal to c(0, 1, 0, 1), 
    # i.e. #00FF00 with an alpha of 1:
    m = apply(a, 1:2, function(x) all(x==0:1))
    # For each RGB layer, replace that part with the equivalent part of 2nd png:
    for(i in 1:4) a[,,i][m] = readPNG(y)[,,i][m]
    writePNG(a,"a.png")
}

1

স্মাইলব্যাসিক, 90 কি বাইট আছে

DEF C I,J
DIM T[LEN(I)]ARYOP.,T,I,16711936ARYOP 2,T,T,T
ARYOP 6,T,T,0,1ARYOP 5,I,I,J,T
END

Iঅগ্রভূমি এবং আউটপুট, Jপটভূমি হয়। উভয়ই 32 বিট এআরজিবি ফর্ম্যাটে পিক্সেলের পূর্ণসংখ্যা অ্যারে।

Ungolfed

DEF C IMAGE,BACKGROUND 'function
 DIM TEMP[LEN(IMAGE)]  'create array "temp"
 ARYOP #AOPADD,TEMP,IMAGE,-RGB(0,255,0)    'temp = image - RGB(0,255,0)
 ARYOP #AOPCLP,TEMP,TEMP,-1,1              'temp = clamp(temp, -1, 1)
 ARYOP #AOPMUL,TEMP,TEMP,TEMP              'temp = temp * temp
 ARYOP #AOPLIP,IMAGE,IMAGE,BACKGROUND,TEMP 'image = linear_interpolate(image, background, temp)
END

ব্যাখ্যা:

এআরওয়াইপ এমন একটি ফাংশন যা অ্যারের প্রতিটি উপাদানকে সাধারণ অপারেশন প্রয়োগ করে।
একে বলা হয়ARYOP mode, output_array, input_array_1, input_array_2, ...

প্রথমে চিত্রের কোন পিক্সেল সবুজ, তা নির্ধারণ করতে -16711936(সবুজ রঙের আরজিবিএ উপস্থাপনা) প্রতিটি পিক্সেল থেকে অগ্রভাগের চিত্রটিতে বিয়োগ করা হয়। এটি এমন একটি অ্যারে দেয় যেখানে 0সবুজ পিক্সেল উপস্থাপন করে এবং অন্য যে কোনও সংখ্যা অ-সবুজ পিক্সেল উপস্থাপন করে।

সব অশূন্য মান রূপান্তর করতে 1, তারা ছক করা হয় (ঋণাত্মক সংখ্যা মুছে ফেলার জন্য), তারপর মধ্যে হিসাবে ধার্য 0এবং 1

এটি কেবলমাত্র 0এস এবং 1এস সহ একটি অ্যারেতে ফলাফল করে ।
0গুলি অগ্রভাগের চিত্রটিতে সবুজ পিক্সেল উপস্থাপন করে এবং পটভূমি থেকে পিক্সেল দিয়ে প্রতিস্থাপন করা উচিত।
1গুলি সবুজ -হীন পিক্সেল উপস্থাপন করে এবং সেগুলি অগ্রভাগ থেকে পিক্সেল দিয়ে প্রতিস্থাপন করা দরকার।

লিনিয়ার ইন্টারপোলেশন ব্যবহার করে এটি সহজেই করা যায়।


0

পিএইচপি, 187 বাইট

for($y=imagesy($a=($p=imagecreatefrompng)($argv[1]))-1,$b=$p($argv[2]);$x<imagesx($a)?:$y--+$x=0;$x++)($t=imagecolorat)($b,$x,$y)-65280?:imagesetpixel($b,$x,$y,$t($a,$x,$y));imagepng($b);

24 বিট পিএনজি ফাইল ধরে; কমান্ড লাইন আর্গুমেন্ট থেকে ফাইলের নাম নেয়, stdout এ লেখেন।
সাথে চালাও -r

ভাঙ্গন

for($y=imagesy(                                 # 2. set $y to image height-1
        $a=($p=imagecreatefrompng)($argv[1])    # 1. import first image to $a
    )-1,
    $b=$p($argv[2]);                            # 3. import second image to $b
    $x<imagesx($a)?:                            # Loop 1: $x from 0 to width-1
        $y--+$x=0;                              # Loop 2: $y from height-1 to 0
        $x++)
            ($t=imagecolorat)($b,$x,$y)-65280?:     # if color in $b is #00ff00
                imagesetpixel($b,$x,$y,$t($a,$x,$y));   # then copy pixel from $a to $b
imagepng($b);                                   # 5. output

0

জাভাস্ক্রিপ্ট (ES6), 290 বাইট

a=>b=>(c=document.createElement`canvas`,w=c.width=a.width,h=c.height=a.height,x=c.getContext`2d`,x.drawImage(a,0,0),d=x.getImageData(0,0,w,h),o=d.data,o.map((_,i)=>i%4?0:o[i+3]=o[i++]|o[i++]<255|o[i]?255:0),x.drawImage(b,0,0),createImageBitmap(d).then(m=>x.drawImage(m,0,0)||c.toDataURL()))

দুটি Imageবস্তু হিসাবে ইনপুট নেয় (সিনট্যাক্সের কারিঙে), যা একটি HTML <image>উপাদান দিয়ে তৈরি করা যেতে পারে । রিটার্নস একটি অঙ্গীকার করা হয়েছে যে এর ফলে ইমেজ করুন Base64- ডেটা URL টি, যা প্রয়োগ করা যেতে পারে সমাধান করা srcএকটি এর <image>

এখানে ধারণাটি ছিল প্রতিটি #00FF00পিক্সেলের জন্য আলফা মান সেট করা 0এবং তারপরে ব্যাকগ্রাউন্ডের শীর্ষে, ব্যাকগ্রাউন্ডটি কীড আউট করে, অগ্রভাগটি আঁকা।

পরীক্ষার স্নিপেট

তাদের ডেটা ইউআরএলগুলি দ্বারা অগ্রভূমি এবং পটভূমি সহ এখানে পোস্ট করার জন্য খুব বড় ছিল, তাই এটি কোডপেনে সরানো হয়েছে:

এটি অনলাইন চেষ্টা করুন!


0

ওএসএল , 83 বাইট

shader a(color a=0,color b=0,output color c=0){if(a==color(0,1,0)){c=b;}else{c=a;}}

দুটি ইনপুট নেয়। প্রথমটি অগ্রভাগ এবং দ্বিতীয়টি পটভূমি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.