wip
This commit is contained in:
parent
662e8ee95e
commit
ac17f705ba
2100
Cargo.lock
generated
2100
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -4,5 +4,8 @@ version = "0.1.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
show-image = "0.14.0"
|
gtk = { package = "gtk4", version = "0.9.6", features=["v4_10"] }
|
||||||
image2 = "1.9.2"
|
image = "0.24"
|
||||||
|
# gtk4 = "0.9.6"
|
||||||
|
# show-image = "0.14.0"
|
||||||
|
# image2 = "1.9.2"
|
||||||
|
@ -11,10 +11,13 @@ with pkgs; mkShell rec {
|
|||||||
libxkbcommon
|
libxkbcommon
|
||||||
egl-wayland
|
egl-wayland
|
||||||
vulkan-loader
|
vulkan-loader
|
||||||
|
gtk4
|
||||||
|
gsettings-desktop-schemas
|
||||||
];
|
];
|
||||||
|
|
||||||
shellHook = ''
|
shellHook = ''
|
||||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${lib.makeLibraryPath (buildInputs) }
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${lib.makeLibraryPath (buildInputs) }
|
||||||
|
export XDG_DATA_DIRS=${pkgs.gtk4}/share/gsettings-schemas/${pkgs.gtk4.name}:$XDG_DATA_DIRS
|
||||||
'';
|
'';
|
||||||
|
|
||||||
WINIT_UNIX_BACKEND="wayland";
|
WINIT_UNIX_BACKEND="wayland";
|
||||||
|
189
src/main.rs
189
src/main.rs
@ -1,57 +1,146 @@
|
|||||||
use image2::*;
|
use gtk::gio::Cancellable;
|
||||||
use show_image::{ImageView, ImageInfo, event, create_window};
|
use gtk::prelude::*;
|
||||||
|
use gtk::{Application, ApplicationWindow, Picture, Scale, Label, FileDialog};
|
||||||
|
use image::{DynamicImage, ImageBuffer, RgbImage};
|
||||||
|
use gtk::{Button, Box as GtkBox, Orientation};
|
||||||
|
use gtk::glib::Propagation;
|
||||||
|
use gtk::gdk_pixbuf::Pixbuf;
|
||||||
|
|
||||||
#[show_image::main]
|
fn main() {
|
||||||
fn main() -> Result<(), Error> {
|
// Инициализация приложения
|
||||||
println!("Hello, world!");
|
let app = Application::builder()
|
||||||
|
.application_id("ru.risdeveau.imageeditor")
|
||||||
|
.build();
|
||||||
|
|
||||||
// Open the image
|
// Запуск приложения
|
||||||
// let image = Image::<u8, Rgb>::open("/home/sweetbread/nix/screenshot.png")?;
|
app.connect_activate(|app| {
|
||||||
|
build_ui(app);
|
||||||
|
});
|
||||||
|
|
||||||
// // Show the image
|
app.run();
|
||||||
// let img = ImageView::new(ImageInfo::rgb8(image.width().try_into().unwrap(), image.height().try_into().unwrap()), image.buffer());
|
|
||||||
// let win = create_window("image", Default::default()).unwrap();
|
|
||||||
// win.set_image("image-001", img).unwrap();
|
|
||||||
|
|
||||||
// // Wait until Escape will be pressed
|
|
||||||
// for event in win.event_channel().unwrap() {
|
|
||||||
// if let event::WindowEvent::KeyboardInput(event) = event {
|
|
||||||
// if event.input.key_code == Some(event::VirtualKeyCode::Escape) && event.input.state.is_pressed() {
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Create new imahe
|
|
||||||
// let new_image = image.new_like();
|
|
||||||
// let mut new_image = new_image.with_color::<Hsv>();
|
|
||||||
|
|
||||||
// for x in 0..image.width() {
|
|
||||||
// for y in 0..image.height() {
|
|
||||||
// let p = image.get_pixel(Point::new(x, y));
|
|
||||||
// let mut hsv_p = Pixel::<Hsv>::new();
|
|
||||||
|
|
||||||
// for i in 0..3 {
|
|
||||||
// hsv_p[i] = p[i];
|
|
||||||
// }
|
|
||||||
|
|
||||||
// new_image.set_pixel(Point::new(x, y), &hsv_p);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// new_image.save("result.png").expect("Failed to save resulting image");
|
|
||||||
|
|
||||||
let mut image = Image::<u8, Hsv>::new(Size::new(100, 100));
|
|
||||||
for x in 0..100 {
|
|
||||||
for y in 0..100 {
|
|
||||||
let mut p = Pixel::<Hsv>::new();
|
|
||||||
p[1] = 1.;
|
|
||||||
p[2] = 1.;
|
|
||||||
image.set_pixel(Point::new(x, y), &p);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
image.save("result.jpg")?;
|
fn build_ui(app: &Application) {
|
||||||
|
// Создание окна
|
||||||
|
let window = ApplicationWindow::builder()
|
||||||
|
.application(app)
|
||||||
|
.title("Image Editor")
|
||||||
|
.default_width(800)
|
||||||
|
.default_height(600)
|
||||||
|
.build();
|
||||||
|
window.set_resizable(false);
|
||||||
|
|
||||||
Ok(())
|
// Создание кнопки для открытия диалога выбора файла
|
||||||
|
let button = Button::with_label("Select Image");
|
||||||
|
|
||||||
|
{
|
||||||
|
let window = window.clone();
|
||||||
|
button.connect_clicked(move |_| {
|
||||||
|
// Создание FileDialog
|
||||||
|
let dialog = FileDialog::builder()
|
||||||
|
.title("Select an Image")
|
||||||
|
.accept_label("Open")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// Фильтр для изображений
|
||||||
|
let filter = gtk::FileFilter::new();
|
||||||
|
filter.add_mime_type("image/*"); // Разрешить только изображения
|
||||||
|
filter.set_name(Some("Image Files"));
|
||||||
|
dialog.set_default_filter(Some(&filter));
|
||||||
|
|
||||||
|
// Показ диалога и обработка результата
|
||||||
|
let window = window.clone();
|
||||||
|
dialog.open(Some(&window), None::<>k::gio::Cancellable>, move |result| {
|
||||||
|
if let Ok(file) = result {
|
||||||
|
// Получение выбранного файла
|
||||||
|
let path = file.path().unwrap();
|
||||||
|
println!("Selected image: {:?}", path);
|
||||||
|
|
||||||
|
// Загрузка изображения (опционально)
|
||||||
|
if let Ok(pixbuf) = Pixbuf::from_file(&path) {
|
||||||
|
println!("Image loaded successfully: {}x{}", pixbuf.width(), pixbuf.height());
|
||||||
|
} else {
|
||||||
|
eprintln!("Failed to load image.");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
eprintln!("File selection canceled.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});}
|
||||||
|
|
||||||
|
let br_slider = Scale::with_range(Orientation::Horizontal, -128., 128., 1.);
|
||||||
|
br_slider.set_value(0.);
|
||||||
|
br_slider.set_hexpand(true);
|
||||||
|
|
||||||
|
let br_text = Label::new(Some("Brightness: 0.00"));
|
||||||
|
|
||||||
|
let br_container = GtkBox::new(Orientation::Horizontal, 5);
|
||||||
|
br_container.append(&br_text);
|
||||||
|
br_container.append(&br_slider);
|
||||||
|
|
||||||
|
{
|
||||||
|
br_slider.clone().connect_change_value(move |_, _, _| {
|
||||||
|
let value = br_slider.value();
|
||||||
|
br_text.set_text(&format!("Brightness: {:.2}", value));
|
||||||
|
|
||||||
|
// Продолжаем обработку события
|
||||||
|
Propagation::Proceed
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let container = GtkBox::new(Orientation::Vertical, 8);
|
||||||
|
container.append(&button);
|
||||||
|
container.append(&br_container);
|
||||||
|
|
||||||
|
window.set_child(Some(&container));
|
||||||
|
|
||||||
|
// // Загрузка изображения
|
||||||
|
// let mut img: RgbImage = ImageBuffer::new(256, 256); // Пример: пустое изображение
|
||||||
|
// let mut dynamic_img = DynamicImage::ImageRgb8(img.clone());
|
||||||
|
|
||||||
|
// // Сохранение изображения во временный файл
|
||||||
|
// let temp_path = "temp_image.png";
|
||||||
|
// dynamic_img.save(temp_path).unwrap();
|
||||||
|
|
||||||
|
// // Создание виджета Picture для отображения изображения
|
||||||
|
// let picture = Picture::for_filename(temp_path);
|
||||||
|
|
||||||
|
// // Создание кнопки
|
||||||
|
// let button = Button::with_label("Edit Image");
|
||||||
|
|
||||||
|
// // Контейнер для размещения виджетов
|
||||||
|
// let container = GtkBox::new(Orientation::Vertical, 5);
|
||||||
|
// container.append(&picture);
|
||||||
|
// container.append(&button);
|
||||||
|
|
||||||
|
// // Обработка нажатия кнопки
|
||||||
|
// button.connect_clicked(move |_| {
|
||||||
|
// // Редактирование изображения
|
||||||
|
// edit_image(&mut img);
|
||||||
|
// dynamic_img = DynamicImage::ImageRgb8(img.clone());
|
||||||
|
|
||||||
|
// // Обновление изображения в интерфейсе
|
||||||
|
// update_image(&picture, &dynamic_img);
|
||||||
|
// });
|
||||||
|
|
||||||
|
// // Добавление контейнера в окно
|
||||||
|
// window.set_child(Some(&container));
|
||||||
|
|
||||||
|
// Отображение окна
|
||||||
|
window.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
// fn edit_image(img: &mut RgbImage) {
|
||||||
|
// for (x, y, pixel) in img.enumerate_pixels_mut() {
|
||||||
|
// // Пример: инвертируем цвета
|
||||||
|
// pixel[0] = 255 - pixel[0]; // Красный
|
||||||
|
// pixel[1] = 255 - pixel[1]; // Зеленый
|
||||||
|
// pixel[2] = 255 - pixel[2]; // Синий
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// fn update_image(picture: &Picture, img: &DynamicImage) {
|
||||||
|
// img.save("tmp.png").unwrap();
|
||||||
|
// picture.set_filename(Some(temp_path));
|
||||||
|
// }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user