Я пишу приложение Windows Forms в C#, которое изменяет размеры изображений, вводимых пользователем. В настоящее время я пытаюсь добавить функциональность, которая позволит пользователю перетаскивать одно или несколько изображений в форму, отображать эти изображения в списке (подробнее о текущей реализации ниже), а затем разрешить пользователю нажимать на изображение на список, в котором выбранное изображение будет отображаться в окне изображения. При этом я буду выполнять изменение размера партии.Каков самый быстрый способ хранения одного или нескольких пользовательских изображений во время выполнения с их исходными размерами для последующей обработки?
Текущая реализация:
в случае DragDrop, заполнить массив строк с отброшенных файлов
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
вызова метода 'areAllImages', который выполняет итерацию по каждому файлу в строке array и возвращает true, если все файлы являются допустимыми типами файлов изображений, else возвращает false
если areAllImages == ложно, показать MessageBox ошибки
if (areAllImages(files) == false) { MessageBox.Show("Only files with .jpg, .jpeg, .gif, .bmp and .png extensions are allowed. Check the file(s) you are attempting to import into the program."); }
если areAllImages == правда, запустить несколько методов, которые делают вещи с интерфейсом (не имеет отношения к вопросу), то перебираем массив, добавив растровые изображения изображения в массиве на ImageList и добавление элементов ImageList в Listview (я назвал его imageListView):
int i = 0; foreach (string element in files) //files == string array containing my image files { string fileName = Path.GetFileName(files[i]); Bitmap img = new Bitmap(files[i]); imageList1.Images.Add("Image" + i, img); imageListView.Items.Add(fileName, i); i++; }
Я тогда обработчик событий для ListView, который показывает то, что элемент был выбран в ListView в PictureBox (Именованный imgBox). Игнорируйте методы updatePreviewer и updateDimensions - они неактуальны.
private void imageListView_SelectedIndexChanged(object sender, EventArgs e) { foreach (ListViewItem item in imageListView.SelectedItems) { int imgIndex = item.ImageIndex; if (imgIndex >= 0 && imgIndex < this.imageList1.Images.Count) { Bitmap img = new Bitmap(this.imageList1.Images[imgIndex]); procedures.updatePreviewer(img, imgBox); updateDimensions(img, heightLabel, widthLabel); } } }
Это работает - но, изображения, которые получают указанные в PictureBox (imgBox) являются 16x16 пикс. Я знаю, что это связано с тем, что для ImageList imageSize установлено значение 16x16, но я не могу найти способ сохранить изображение с перетаскиванием и отброшенное изображение с его/их исходными размерами. Максимум 256, и мне придется разрешить вводить изображения намного больше, чем это.
Вопрос: Как я могу манипулировать этой реализацией, чтобы показывать изображения с их оригинальными размерами? Если это невозможно/выполнимо, каковы альтернативные способы хранения этих изображений, чтобы я мог получить к ним доступ через какой-то контейнер списка и показать их в PictureBox с их исходными размерами?
Спасибо
Вы можете добавить абстракцию: 'class MyImage' с' Image' (использовать для хранения перетаскиваемого изображения и обработать его позже, лучше всего только запомнить путь и не использовать память) и ['Thumbnail' ] (https://en.wikipedia.org/wiki/Thumbnail) (используется для отображения изображения в списке, 16x16 или любого другого размера, который вы предпочитаете, может быть настройкой). – Sinatr
Хорошо, я поиграю с этим и посмотрю, смогу ли я заставить его работать. благодаря –