2016-12-06 7 views
0

Я пишу приложение 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 с их исходными размерами?

Спасибо

+0

Вы можете добавить абстракцию: 'class MyImage' с' Image' (использовать для хранения перетаскиваемого изображения и обработать его позже, лучше всего только запомнить путь и не использовать память) и ['Thumbnail' ] (https://en.wikipedia.org/wiki/Thumbnail) (используется для отображения изображения в списке, 16x16 или любого другого размера, который вы предпочитаете, может быть настройкой). – Sinatr

+0

Хорошо, я поиграю с этим и посмотрю, смогу ли я заставить его работать. благодаря –

ответ

0

Решил проблему, добавив массив для хранения всех путей файлов импортируемых изображений и вместо загрузки изображения из индекса списка следует, я загружать изображения с путем в индексном массиве, равный объему item clicked

 Смежные вопросы

  • Нет связанных вопросов^_^