feat: 截屏改为抽样,提升性能。
This commit is contained in:
parent
479fdba9f6
commit
a6e91dfae1
7
src-tauri/Cargo.lock
generated
7
src-tauri/Cargo.lock
generated
@ -573,6 +573,7 @@ dependencies = [
|
||||
"base64",
|
||||
"bmp",
|
||||
"color_space",
|
||||
"either",
|
||||
"futures",
|
||||
"hex",
|
||||
"once_cell",
|
||||
@ -611,6 +612,12 @@ version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c"
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
|
||||
|
||||
[[package]]
|
||||
name = "embed_plist"
|
||||
version = "1.2.2"
|
||||
|
@ -32,6 +32,7 @@ rumqttc = "0.17.0"
|
||||
time = { version = "0.3.17", features = ["formatting"] }
|
||||
color_space = "0.5.3"
|
||||
futures = "0.3.25"
|
||||
either = "1.8.0"
|
||||
|
||||
[features]
|
||||
# by default Tauri runs in production mode
|
||||
|
@ -120,13 +120,15 @@ impl CoreManager {
|
||||
let start_at = Instant::now();
|
||||
match screenshot.get_top_colors().await {
|
||||
Ok(colors) => {
|
||||
let start = screenshot.get_top_of_led_strip_range().min().unwrap_or(0);
|
||||
let start = screenshot.get_top_of_led_start_at().min(screenshot.get_top_of_led_end_at());
|
||||
|
||||
let colors_len = colors.len();
|
||||
for (index, color) in colors.into_iter().enumerate() {
|
||||
global_colors.insert(index + start, color);
|
||||
}
|
||||
|
||||
info!("led count: {}, spend: {:?}", global_colors.len(), start_at.elapsed());
|
||||
|
||||
if global_colors.len() == 60 {
|
||||
let mut colors = vec![];
|
||||
for index in 0..global_colors.len() {
|
||||
@ -165,6 +167,7 @@ impl CoreManager {
|
||||
tx: mpsc::Sender<Screenshot>,
|
||||
) -> anyhow::Result<()> {
|
||||
let mut picker = DisplayPicker::from_config(config)?;
|
||||
info!("width: {}", picker.config.display_width);
|
||||
|
||||
loop {
|
||||
let start = Instant::now();
|
||||
@ -173,7 +176,7 @@ impl CoreManager {
|
||||
if let AmbientLightMode::Follow = *lock {
|
||||
drop(lock);
|
||||
let screenshot = picker.take_screenshot()?;
|
||||
// info!("Take Screenshot Spend: {:?}", start.elapsed());
|
||||
info!("Take Screenshot Spend: {:?}", start.elapsed());
|
||||
tx.send(screenshot).await;
|
||||
} else {
|
||||
break;
|
||||
|
@ -35,8 +35,8 @@ impl Picker {
|
||||
display_height: 1200,
|
||||
top_led_strip: LedStripConfig {
|
||||
index: 1,
|
||||
global_start_position: 32,
|
||||
global_end_position: 60,
|
||||
global_start_position: 59,
|
||||
global_end_position: 32,
|
||||
},
|
||||
bottom_led_strip: LedStripConfig {
|
||||
index: 0,
|
||||
@ -60,8 +60,8 @@ impl Picker {
|
||||
display_height: 1692,
|
||||
top_led_strip: LedStripConfig {
|
||||
index: 0,
|
||||
global_start_position: 0,
|
||||
global_end_position: 32,
|
||||
global_start_position: 31,
|
||||
global_end_position: 0,
|
||||
},
|
||||
bottom_led_strip: LedStripConfig {
|
||||
index: 0,
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
use std::ops::Range;
|
||||
|
||||
use color_space::{Hsv, Rgb};
|
||||
use either::Either;
|
||||
|
||||
use super::{
|
||||
config::{DisplayConfig, LedStripConfig},
|
||||
@ -28,9 +28,11 @@ impl Screenshot {
|
||||
.await
|
||||
}
|
||||
|
||||
pub fn get_top_of_led_strip_range(&self) -> Range<usize> {
|
||||
pub fn get_top_of_led_start_at(&self) -> usize {
|
||||
self.config.top_led_strip.global_start_position
|
||||
..self.config.top_led_strip.global_end_position
|
||||
}
|
||||
pub fn get_top_of_led_end_at(&self) -> usize {
|
||||
self.config.top_led_strip.global_end_position
|
||||
}
|
||||
|
||||
async fn get_x_colors(
|
||||
@ -41,7 +43,11 @@ impl Screenshot {
|
||||
let bitmap = &self.bitmap;
|
||||
let number_of_leds = strip_config
|
||||
.global_start_position
|
||||
.abs_diff(strip_config.global_end_position);
|
||||
.abs_diff(strip_config.global_end_position)
|
||||
+ 1;
|
||||
if number_of_leds == 0 {
|
||||
return Ok(vec![]);
|
||||
}
|
||||
let cell_size_x = self.config.display_width / number_of_leds;
|
||||
let cell_size_y = self.config.display_height / 8;
|
||||
let cell_size = cell_size_x * cell_size_y;
|
||||
@ -50,32 +56,43 @@ impl Screenshot {
|
||||
XPosition::Bottom => {
|
||||
self.config.display_height - 20 - cell_size_y..self.config.display_height - 20
|
||||
}
|
||||
}
|
||||
.step_by(5);
|
||||
|
||||
let x_range = if strip_config.global_start_position < strip_config.global_end_position {
|
||||
Either::Left(strip_config.global_start_position..=strip_config.global_end_position)
|
||||
} else {
|
||||
Either::Right(
|
||||
(strip_config.global_end_position..=strip_config.global_start_position).rev(),
|
||||
)
|
||||
};
|
||||
|
||||
let mut colors = Vec::new();
|
||||
let stride = bitmap.len() / self.config.display_height;
|
||||
|
||||
for pos in strip_config.global_start_position..strip_config.global_end_position {
|
||||
for pos in x_range {
|
||||
let mut r = 0.0;
|
||||
let mut g = 0.0;
|
||||
let mut b = 0.0;
|
||||
for x in pos * cell_size_x..(pos + 1) * cell_size_x {
|
||||
let mut count = 0;
|
||||
for x in (pos * cell_size_x..(pos + 1) * cell_size_x).step_by(5) {
|
||||
for y in y_range.to_owned() {
|
||||
let i = stride * y + 4 * x;
|
||||
r += bitmap[i + 2] as f64;
|
||||
g += bitmap[i + 1] as f64;
|
||||
b += bitmap[i] as f64;
|
||||
count+=1;
|
||||
}
|
||||
}
|
||||
let rgb = Rgb::new(
|
||||
r / cell_size as f64,
|
||||
g / cell_size as f64,
|
||||
b / cell_size as f64,
|
||||
r / count as f64,
|
||||
g / count as f64,
|
||||
b / count as f64,
|
||||
);
|
||||
let hsv = Hsv::from(rgb);
|
||||
// info!("HSV: {:?}", [hsv.h, hsv.s, hsv.v]);
|
||||
let color = LedColor::from_hsv(hsv.h, hsv.s, hsv.v);
|
||||
// info!("color: {:?}", color.get_rgb());
|
||||
// paris::info!("color: {:?}", color.get_rgb());
|
||||
colors.push(color);
|
||||
}
|
||||
return Ok(colors);
|
||||
|
@ -3,8 +3,8 @@ import ReactDOM from "react-dom/client";
|
||||
import App from "./App";
|
||||
import "./style.css";
|
||||
|
||||
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
|
||||
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
</React.StrictMode>
|
||||
</React.StrictMode>,
|
||||
);
|
Loading…
Reference in New Issue
Block a user