我正在编写一个Windows窗体应用程序在C#中调整用户输入图像的大小。我目前正在尝试添加允许用户将一个或多个图像拖放到窗体上的功能,将这些图像显示在列表中(下面的当前实现的更多细节),然后允许用户点击图像所选图像将显示在图片框中的列表。有了这个,我将实施'批量'调整大小。在运行时用最初的尺寸存储一个或多个用户输入图像以便稍后处理的最快方法是什么?
当前实现:
在DragDrop事件,填充被丢弃的文件
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
调用 'areAllImages' 方法的字符串数组,遍历字符串中的每个文件数组并返回true,如果所有文件都是有效的图像文件类型,则返回false
如果areAllImages ==假,显示错误消息框
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 == true,则运行做的东西与接口的一些方法(不相关的质疑),然后通过遍历数组,增加的位图在阵列中的图像列表和图像添加图像列表元素到一个ListView(I把它命名为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)显示的图像是16×16像素。我知道这是因为ImageList的imageSize被设置为16x16,但我找不到一种方式来存储拖动和放置的图像以及它们的原始尺寸。最大值是256,而且我将不得不允许输入比这更大的图像。
问题:我该如何操纵这个实现来显示图像的原始尺寸?如果这是不可能的/可行的,我可以用什么方法来存储这些图像,以便我可以通过某种列表容器访问它们,并将它们显示在一个PictureBox中并保留其原始尺寸?
谢谢
您可以添加一些抽象:'类MyImage'与'Image'(用于存储拖动的图像和稍后处理,更好的想法只是记住路径,不使用内存)和['缩略图' ](https://en.wikipedia.org/wiki/Thumbnail)(用于在列表中显示图像,16x16或任何您喜欢的大小,可以是一个设置)。 – Sinatr
好吧,我会玩这个,看看我能否得到它的工作。谢谢 –