Chìa khóa thành công


23

Giá trị màu RGB #00FF00là một giá trị khá quan trọng: nó được sử dụng để tạo phim, chương trình TV, thông báo thời tiết và hơn thế nữa. Đó là màu "TV xanh" hoặc "màn hình xanh" nổi tiếng.

Các thách thức

Nhiệm vụ của bạn là viết một chương trình có hai hình ảnh đầu vào, cả ở định dạng PNG (hoặc trong loại đối tượng hình ảnh của thư viện hình ảnh của bạn) và có cùng kích thước. Một hình ảnh có thể là bất kỳ hình ảnh cũ. Một cái khác là hình ảnh sẽ có nền màu #00FF00. Hình ảnh đầu ra sẽ bao gồm hình ảnh thứ hai được phủ lên trên hình đầu tiên, không có #00FF00màu hiện diện (ngoại trừ trong hình ảnh đầu tiên). Đầu vào và đầu ra có thể được thực hiện với các tệp, GUI, v.v. Bạn được phép lấy một mảng các giá trị RGB làm đầu vào, như được thấy ở đây . Bạn có thể cho rằng một hình ảnh chỉ có các pixel có độ mờ hoàn toàn.

Về cơ bản...

Tạo một chương trình có mọi #00FF00 pixel trong một ảnh và thay thế nó bằng pixel tương ứng trong ảnh nền.

Các trường hợp thử nghiệm

Được cung cấp rộng rãi bởi @dzaima: Bối cảnh: Tiền cảnh : Đầu ra:
hình ảnh hồ sơ của tôi

dennis

đầu ra


Tất nhiên, sơ hở tiêu chuẩn bị nghiêm cấm . Điều này bao gồm sử dụng một nguồn tài nguyên trực tuyến để làm điều đó cho bạn.
Đây là , vì vậy có thể đoạn mã ngắn nhất sẽ thắng và người lập trình giỏi nhất ...


2
Chúng ta có thể lấy một đối tượng hình ảnh ở định dạng gốc của ngôn ngữ / thư viện làm đầu vào hay chúng ta phải đọc hình ảnh qua tên tệp?
notjagan

@notjagan Bạn có thể lấy các đối tượng hình ảnh làm đầu vào.
ckjbgames

3
I / O của mảng các mảng số nguyên có được chấp nhận hay chúng ta thực sự bị hạn chế ở một số bộ I / O hình ảnh khác?
Jonathan Allan

1
@PeterCordes Tôi sẽ cho phép điều đó.
ckjbgames

1
@PeterCordes ok
ckjbgames

Câu trả lời:


14

mã máy x86-64 (và x86-32), 13 15 13 byte

thay đổi:

  1. Sửa lỗi: phiên bản đầu tiên chỉ kiểm tra G = 0xff, không yêu cầu R và B là 0. Tôi đã thay đổi để sửa đổi nền tại chỗ để tôi có thể sử dụng lodsdtrên nền trước để có pixel fg eaxcho cmp eax, imm32mã hóa dạng ngắn (5 byte ), thay vì cmp dh,0xff(3 byte).

  2. Lưu 2 byte: nhận thấy rằng sửa đổi bg tại chỗ được phép sử dụng toán hạng bộ nhớ cho cmov, lưu movtải 2 byte (và lưu một thanh ghi, trong trường hợp có vấn đề).


Đây là một chức năng theo quy ước gọi System V x86-64, có thể gọi trực tiếp từ C hoặc C ++ (trên các hệ thống không phải Windows x86-64) với chữ ký này:

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

Định dạng hình ảnh là RGB0 32bpp, với thành phần màu xanh lá cây ở địa chỉ bộ nhớ thấp thứ 2 trong mỗi pixel. Các nền nền trước được sửa đổi tại chỗ. pixel_countlà hàng * cột. Nó không quan tâm đến hàng / cột; nó chỉ là chromekey pha trộn tuy nhiên nhiều từ khóa của bộ nhớ mà bạn chỉ định.

RGBA (với A được yêu cầu là 0xFF) sẽ yêu cầu sử dụng hằng số khác nhau, nhưng không thay đổi kích thước chức năng. Các DWORD tiền cảnh được so sánh về sự bằng nhau chính xác so với hằng số 32 bit tùy ý được lưu trữ trong 4 byte, do đó, có thể dễ dàng hỗ trợ bất kỳ màu nào theo thứ tự pixel hoặc màu sắc của phím màu.

Mã máy tương tự cũng hoạt động ở chế độ 32 bit. Để lắp ráp thành 32 bit, thay đổirdi thành editrong nguồn. Tất cả các thanh ghi khác trở thành 64 bit đều ẩn (lodsd / stosd và loop), và các reg rõ ràng khác ở lại 32 bit. Nhưng lưu ý rằng bạn sẽ cần một trình bao bọc để gọi từ C 32 bit, vì không có quy ước gọi x86-32 tiêu chuẩn nào sử dụng các regs tương tự như x86-64 SysV.

Danh sách NASM (mã máy + mã nguồn), được nhận xét cho người mới bắt đầu với mô tả về những gì các hướng dẫn phức tạp hơn làm. (Sao chép hướng dẫn tham khảo hướng dẫn là phong cách xấu trong sử dụng bình thường.)

 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

Để lấy nguồn NASM ban đầu ra khỏi danh sách này, hãy loại bỏ 26 ký tự hàng đầu của mỗi dòng <chromakey.lst cut -b 26- > chromakey.asm. Tôi đã tạo điều này với
nasm -felf64 chromakey-blend.asm -l /dev/stdout | cut -b -28,$((28+12))- danh sách NASM để lại nhiều cột trống hơn tôi muốn giữa mã máy và nguồn. Để xây dựng một tệp đối tượng, bạn có thể liên kết với C hoặc C ++, sử dụng nasm -felf64 chromakey.asm. (Hoặc làyasm -felf64 chromakey.asm ).

chưa được kiểm tra , nhưng tôi khá tự tin rằng ý tưởng cơ bản về tải / tải / cmov / cửa hàng là âm thanh, bởi vì nó rất đơn giản.

Tôi có thể lưu 3 byte nếu tôi có thể yêu cầu người gọi vượt qua hằng số khóa sắc độ (0x00ff00) như một đối số phụ, thay vì mã hóa cứng hằng số vào hàm. Tôi không nghĩ rằng các quy tắc thông thường cho phép viết một hàm chung hơn có người gọi thiết lập các hằng số cho nó. Nhưng nếu có, arg thứ 3 (hiện tại dummy) được truyền vào edxtrong x86-64 SysV ABI. Chỉ cần thay đổi cmp eax, 0x0000ff00(5B) thành cmp eax, edx(2B).


Với SSE4 hoặc AVX, bạn có thể thực hiện việc này nhanh hơn (nhưng kích thước mã lớn hơn) pcmpeqdblendvpsđể thực hiện pha trộn biến kích thước phần tử 32 bit được điều khiển bởi mặt nạ so sánh. (Với pand, bạn có thể bỏ qua byte cao). Đối với RGB24 được đóng gói, bạn có thể sử dụng pcmpeqbvà sau đó là 2x pshufb+ pandđể lấy TRUE theo byte trong đó cả 3 thành phần của pixel đó khớp với nhau pblendvb.

(Tôi biết đây là môn đánh gôn, nhưng tôi đã xem xét thử MMX trước khi đi với số nguyên vô hướng.)


Bạn có thể gửi cho tôi một thực thi được thực hiện với mã máy này?
ckjbgames

x86_32, làm ơn.
ckjbgames

@ckjbgames: Tôi chưa viết một người gọi tải / lưu hình ảnh, chỉ là phần sửa đổi pixel tại chỗ. Tôi phải làm điều đó trước khi nó có ý nghĩa để xây dựng một thực thi. Nhưng nếu tôi đã làm, loại thực thi? Windows PE32? ELF32 Linux? FreeBSD ??
Peter Cordes

ELF32, nếu bạn muốn.
ckjbgames

@ckjbgames: Nếu tôi tìm thấy thời gian, tôi sẽ tìm một thư viện tải hình ảnh và viết một cái gì đó. Tôi đã thêm một đoạn về cách biến danh sách trở lại thành mã mà bạn có thể lắp ráp nasm -felf32. (Đối với 32 bit, bạn cũng sẽ cần một hàm bao bọc để gọi từ C, bởi vì nó vẫn sử dụng các thanh ghi giống như x86-64 SysV ABI.)
Peter Cordes

13

Toán học 57 35 byte

cập nhật: theo mặc định, một nền màu xanh lá cây được loại bỏ bằng cách sử dụng RemoveBackground. Đệ trình đầu tiên bao gồm tham số thứ hai không cần thiết, `{" Nền ", Xanh}".


#~ImageCompose~RemoveBackground@#2&

Xóa nền của hình ảnh 2 và kết quả với hình ảnh 1.


Thí dụ

i1

Phần sau, ở dạng tiền tố thay vì dạng infix, cho thấy rõ hơn cách thức hoạt động của mã.

i2


4
Điều này có hiệu quả với những hình ảnh không phải là "nền" màu xanh lá cây không? (Dường như có một mảng xanh nhỏ còn lại trong đầu ra của bạn)
DBS

Nếu có một "hòn đảo" màu xanh lá cây trong hình ảnh, tham số bổ sung, `{" Bối cảnh ", Màu xanh lá cây}", sẽ được yêu cầu, sẽ nâng tổng số lên 57 byte. Đó là lần gửi đầu tiên của tôi. bị cô lập ở tiền cảnh của bức tranh, tham số đó đã bị loại bỏ
DavidC

11

Python 3 + gọn gàng , 59 byte

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

Hãy thử trực tuyến!

Đầu vào được đưa ra theo định dạng của một numpymảng, với các bộ ba số nguyên biểu thị các pixel ( #00FF00trong đó mã màu hex tương đương với [0, 255, 0]). Mảng đầu vào được sửa đổi tại chỗ, được phép cho mỗi meta .

Hình ảnh ví dụ

Đầu vào (từ câu hỏi)

Lý lịch:

ảnh đại diện của ckjbgames

Vấn đề xung quanh:

Ảnh đại diện của Dennis

Hình ảnh tiền cảnh sau khi chạy chức năng:

Hình ảnh được trộn với # 00FF00 được thay thế bằng pixel nền

Tham chiếu thực hiện (sử dụng opencvđể đọc tệp hình ảnh)

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)

Hiển thị hình ảnh ra màn hình và ghi nó vào một tập tin đầu ra.


17
Những gì với tất cả các chấm đỏ trên hình ảnh kết quả?
Yytsi

1
Tôi đã hỏi về I / O - điều này dường như tuân thủ từ ngữ hiện tại (tức là "thư viện của bạn"), nếu vậy, bản thân cv2 có yêu cầu nhập dữ liệu không? Nếu không, bạn có thể làm điều đó trong 54 bằng cách không sử dụng bất kỳ hàm numpy nào và không nhập numpy : lambda f,b:[x[list(x[0])==[0,255,0]]for x in zip(f,b)]. Nếu danh sách các số nguyên cũng thực sự được chấp nhận thì bạn có thể thực hiện trong 48 vớilambda f,b:[x[x[0]==[0,255,0]]for x in zip(f,b)]
Jonathan Allan

.. thực tế ngay cả khi cump2 được yêu cầu để thực hiện chuyển đổi Tôi vẫn nghĩ bạn có thể thực hiện phiên bản 54 byte, vì chúng tôi không cần phải nhập cv2 cho thử thách.
Jonathan Allan

5
Nếu G == 255, giá trị được thay thế ngay cả khi R và B không bằng 0 dẫn đến các chấm đỏ. Điều này cũng xảy ra đối với các ban nhạc khác thậm chí khó khăn mà ít nhìn thấy hơn. Vì vậy, nó thực hiện kiểm tra logic độc lập với nhau và hoán đổi các kênh đơn lẻ ngay cả khi chỉ đáp ứng một trong các điều kiện. Ví dụ: nếu một pixel là [0 255 37]các dải màu đỏ và xanh lá cây sẽ được thay thế.
Leander Moesinger

2
@LeanderMoesinger: Phát hiện tốt. Tôi cũng có lỗi đó>. <; IDK tại sao tôi nghĩ rằng chỉ kiểm tra màu xanh lá cây = 0xFF trong khi bỏ qua R và B là chính xác!
Peter Cordes

9

Đang xử lý, 116 99 byte

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

Thật không may, xử lý không hỗ trợ công cụ java 8, như lambdas.

Ví dụ thực hiện: (lưu hình ảnh dưới dạng out.pngvà cũng vẽ nó trên màn hình)

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;}

Bạn có thể thoát khỏi settings()và các setup()chức năng và chỉ cần chạy mã trực tiếp.
Kevin Workman

@KevinWorkman Tôi có các cài đặt và thiết lập ở đó để nó hiển thị hình ảnh trên màn hình, nếu không thì không thể
dzaima 17/07/17

#ff00hoặc 0xff00giống như #00ff00trong chế biến?
Peter Cordes

@PeterCordes # FF00 đưa ra lỗi cú pháp, thật đáng buồn và # 00FF00 == 0xFF00FF00, vì vậy 0xFF00 không hoạt động vì nó kiểm tra giá trị alpha 0
dzaima 18/07/17

@dzaima: Bạn có thể chụp ảnh ở định dạng RGB0, vậy 0x0000FF00mẫu bit bạn đang tìm có phải không?
Peter Cordes

6

Bash + ImageMagick, 45 byte

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

Lấy hai hình ảnh làm đối số và hiển thị đầu ra trên màn hình. Thay đổi x:để $3ghi vào một đối số tập tin thứ ba thay thế. Phương pháp rất đơn giản: đọc ảnh "nền"; đọc hình ảnh "tiền cảnh"; diễn giải lại màu "vôi" (# 00ff00) dưới dạng trong suốt trong hình ảnh thứ hai; sau đó kết hợp hình ảnh thứ hai lên đầu tiên và đầu ra.

ImageMagick: 28 byte?

Tôi có thể đã gửi câu hỏi này dưới dạng câu trả lời của ImageMagick nhưng không rõ cách xử lý các đối số. Nếu bạn muốn khẳng định rằng ImageMagick là một ngôn ngữ dựa trên ngăn xếp (loại này không thực sự đúng nhưng hầu như ... thật kỳ lạ) thì đó -transparent lime -compositelà một chức năng mong đợi hai hình ảnh trên ngăn xếp và để lại một hình ảnh được hợp nhất trên ngăn xếp .. Có lẽ đó là đủ tốt để đếm?


3

MATL , 40 37 31 byte

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

Ví dụ chạy với trình thông dịch ngoại tuyến. Các hình ảnh được nhập bởi URL của họ (tên tệp cục bộ cũng có thể được cung cấp).

nhập mô tả hình ảnh ở đây

Giải trình

,        % 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

Bình thường , 27 byte

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

Nó được trích dẫn đầu vào. Đầu vào là hai đường dẫn của tệp hình ảnh. Output file o.pngThật không may mà không thể được thử nghiệm trên người phiên dịch trực tuyến vì lý do an toàn ( 'bị vô hiệu hóa trên đó). Bạn sẽ cần phải có được Pyth trên máy tính của mình để kiểm tra nó.

Giải trình

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

Bản thân hàm pha trộn sắc độ-khóa là 13 byte, giống như câu trả lời mã máy x86 của tôi. Tôi đã không nhận ra trước đây rằng đây cũng là một hình ảnh bàn giao hoàn chỉnh.
Peter Cordes

2

Matlab 2016b và Octave, 62 59 byte

Dữ liệu vào: A = MxNx3 unit8 ma trận nền trước, ma trận nền B = MxNx3 unit8.

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

Đầu ra: A = MxNx3 đơn vị ma trận8

Sử dụng mẫu:

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

C ++, 339 byte

Cái này sử dụng CImg và nó cũng có thể lấy các tệp ở các định dạng khác. Kết quả được hiển thị trong một cửa sổ.

#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();}}

Biên dịch với g++ chromakey.cpp -g -L/usr/lib/i386-linux-gnu -lX11 -o chromakey -pthread.


1

R, 135 byte

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")}

Hàm ẩn danh, lấy 2 đường dẫn tệp png làm đối số và xuất ra ảnh png được gọi a.png.

Hơi vô duyên, với lời giải thích:

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

SmileBASIC, 90 byte là

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 là tiền cảnh và đầu ra, J là nền. Cả hai đều là mảng số nguyên pixel, ở định dạng ARGB 32 bit.

Bị đánh cắp

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

Giải trình:

ARYOP là một hàm áp dụng một thao tác đơn giản cho mọi phần tử trong một mảng.
Nó được gọi là nhưARYOP mode, output_array, input_array_1, input_array_2, ...

Đầu tiên, để xác định pixel nào trong ảnh có màu xanh lá cây, -16711936(đại diện RGBA của màu xanh lục) được trừ đi từ mỗi pixel trong ảnh nền trước. Điều này cung cấp cho một mảng trong đó0 đại diện cho pixel màu xanh lá cây và bất kỳ số nào khác đại diện cho pixel không màu xanh lá cây.

Để chuyển đổi tất cả các giá trị khác không thành 1, chúng được bình phương (để loại bỏ các số âm), sau đó được kẹp vào giữa 01.

Điều này dẫn đến một mảng chỉ có 0s và 1s.
0s đại diện cho các pixel màu xanh lục trong hình ảnh nền trước và nên được thay thế bằng các pixel từ nền.
1s đại diện cho các pixel không có màu xanh lục và những pixel này sẽ cần được thay thế bằng các pixel từ nền trước.

Điều này có thể dễ dàng được thực hiện bằng cách sử dụng phép nội suy tuyến tính.


0

PHP, 187 byte

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

giả định các tệp PNG 24 bit; lấy tên tệp từ đối số dòng lệnh, ghi vào thiết bị xuất chuẩn.
Chạy với -r.

phá vỡ

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

JavaScript (ES6), 290 byte

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

Lấy đầu vào là hai Imageđối tượng (theo cú pháp currying), có thể được tạo bằng <image>phần tử HTML . Trả về một Promise giải quyết URL dữ liệu Base64 của hình ảnh kết quả, có thể được áp dụng cho srcmột<image> .

Ý tưởng ở đây là đặt giá trị alpha cho từng #00FF00pixel 0và sau đó vẽ nền trước, với nền của nó được khóa, trên cùng của nền.

Kiểm tra đoạn trích

Bao gồm tiền cảnh và hậu cảnh bởi các URL dữ liệu của họ quá lớn để đăng ở đây, vì vậy nó đã được chuyển sang CodePen:

Hãy thử trực tuyến!


0

OSL , 83 byte

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

Có hai đầu vào. Đầu tiên là nền trước và thứ hai là nền.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.