feat(jump-hop): optimize generated assets and runtime background
This commit is contained in:
@@ -2,9 +2,11 @@ use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64_STANDARD};
|
||||
use image::{DynamicImage, ImageFormat, Rgba, RgbaImage};
|
||||
use platform_image::DownloadedImage;
|
||||
use platform_image::generated_asset_sheets::{
|
||||
GeneratedAssetSheetPersistInput, GeneratedAssetSheetPersistPrompt,
|
||||
GeneratedAssetSheetPromptInput, apply_generated_asset_sheet_green_screen_alpha,
|
||||
GeneratedAssetSheetAlphaOptions, GeneratedAssetSheetPersistInput,
|
||||
GeneratedAssetSheetPersistPrompt, GeneratedAssetSheetPromptInput,
|
||||
apply_generated_asset_sheet_alpha_with_options, apply_generated_asset_sheet_green_screen_alpha,
|
||||
build_generated_asset_sheet_prompt, crop_generated_asset_sheet_view_edge_matte,
|
||||
crop_generated_asset_sheet_view_edge_matte_with_options,
|
||||
prepare_generated_asset_sheet_put_request, slice_generated_asset_sheet,
|
||||
slice_generated_asset_sheet_two_items_per_row,
|
||||
};
|
||||
@@ -142,6 +144,68 @@ fn generated_asset_sheet_green_screen_alpha_removes_green_background() {
|
||||
assert_eq!(cleaned.get_pixel(10, 10).0[3], 255);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn generated_asset_sheet_magenta_key_preserves_green_white_and_disconnected_key_subject() {
|
||||
let mut sheet = RgbaImage::from_pixel(28, 28, Rgba([255, 0, 255, 255]));
|
||||
for y in 6..22 {
|
||||
for x in 6..14 {
|
||||
sheet.put_pixel(x, y, Rgba([64, 188, 74, 255]));
|
||||
}
|
||||
}
|
||||
for y in 6..22 {
|
||||
for x in 14..22 {
|
||||
sheet.put_pixel(x, y, Rgba([244, 244, 236, 255]));
|
||||
}
|
||||
}
|
||||
for y in 12..16 {
|
||||
for x in 12..16 {
|
||||
sheet.put_pixel(x, y, Rgba([255, 0, 255, 255]));
|
||||
}
|
||||
}
|
||||
|
||||
let cleaned = apply_generated_asset_sheet_alpha_with_options(
|
||||
DynamicImage::ImageRgba8(sheet),
|
||||
GeneratedAssetSheetAlphaOptions::jump_hop_magenta_screen(),
|
||||
)
|
||||
.to_rgba8();
|
||||
|
||||
assert_eq!(cleaned.get_pixel(0, 0).0[3], 0);
|
||||
assert_eq!(cleaned.get_pixel(8, 8).0[3], 255);
|
||||
assert_eq!(cleaned.get_pixel(18, 8).0[3], 255);
|
||||
assert_eq!(
|
||||
cleaned.get_pixel(13, 13).0[3],
|
||||
255,
|
||||
"非边缘连通的 key 色像素不应被当成背景清掉"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn generated_asset_sheet_magenta_edge_matte_does_not_remove_white_subject() {
|
||||
let mut sheet = RgbaImage::from_pixel(24, 24, Rgba([0, 0, 0, 0]));
|
||||
for y in 2..22 {
|
||||
for x in 2..22 {
|
||||
sheet.put_pixel(x, y, Rgba([246, 246, 240, 255]));
|
||||
}
|
||||
}
|
||||
for y in 0..24 {
|
||||
sheet.put_pixel(0, y, Rgba([255, 0, 255, 255]));
|
||||
sheet.put_pixel(23, y, Rgba([255, 0, 255, 255]));
|
||||
}
|
||||
|
||||
let cleaned = crop_generated_asset_sheet_view_edge_matte_with_options(
|
||||
DynamicImage::ImageRgba8(sheet),
|
||||
GeneratedAssetSheetAlphaOptions::jump_hop_magenta_screen(),
|
||||
)
|
||||
.to_rgba8();
|
||||
|
||||
assert_eq!(cleaned.get_pixel(1, 1).0[3], 255);
|
||||
assert!(
|
||||
cleaned
|
||||
.pixels()
|
||||
.any(|pixel| pixel.0 == [246, 246, 240, 255])
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn generated_asset_sheet_view_edge_matte_trims_transparent_border() {
|
||||
let mut sheet = RgbaImage::from_pixel(20, 20, Rgba([0, 0, 0, 0]));
|
||||
|
||||
Reference in New Issue
Block a user