Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
24 / 24 / 9
Регистрация: 15.11.2010
Сообщений: 95
1

Медленно отображаются Превью изображений в Listview

23.11.2010, 12:41. Показов 4654. Ответов 17
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    
private void timer2_Tick(object sender , EventArgs e)
 {
 for (int i = 0; i < 20; i++)
{
 Image images = Image.FromFile(String.Format(@"{0}" , listView1.Items[i].Tag)); //путь к файлу в tag.
 imageList1.Images.Add(GetThmb(images , 128 , 128));                 
 listView1.Items[i].Text = "";
 listView1.Items[i].ImageIndex = i;
}
 timer2.Enabled = false;
            
}
private static bool ThumbnailCallback()
 {
 return false;
 }
 
public static Image GetThmb(Image img , int height , int width)
{
Image.GetThumbnailImageAbort myCallback = ThumbnailCallback;
Bitmap myBitmap = (Bitmap)img;
return myBitmap.GetThumbnailImage(width , height , myCallback , IntPtr.Zero); ;
}
Все работает превьюшки делает, но очень медленно, когда программа пытается обработать 1500+ изображений(обои). Даже при обработки 20 занимает минуту точно. Как я понимаю, это происходит из-за
C#
1
Image images = Image.FromFile(String.Format(@"{0}" , listView1.Items[i].Tag));
Файл открывается целиком, можно ли как то ускорить данный процесс.

Добавлено через 16 минут

Добавлено через 1 час 12 минут
Нашел информацию что можно просто из jpg вытащить превью, вопрос как это реализовать на C#
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2010, 12:41
Ответы с готовыми решениями:

Исчезли некоторые иконки и не отображаются превью изображений
Всем доброго времени суток. Недавно возника проблема, на ровном месте. 1е - исчезли иконки...

Загрузчик изображений с превью на HTML5. Превью без загрузки
Здравствуйте, уважаемые! Есть острая необходимость создать на сайте возможность загружать...

Почему не отображаются превью фоток?
Почему не отображаются превью фоток? режим галаери включен в админке. выводит текст вот...

Не отображаются эскизы (превью) картинок в Windows 7
Всем добрый вечер! С недавних пор возникла такая проблема. Не отображаются эскизы НЕКОТОРЫХ...

__________________

Записывайтесь на профессиональные курсы С#-разработчиков‌
17
681 / 595 / 138
Регистрация: 08.05.2009
Сообщений: 1,098
23.11.2010, 13:28 2
Цитата Сообщение от exlim Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
private void timer2_Tick(object sender , EventArgs e)
{
for (int i = 0; i < 20; i++)
{
Image images = Image.FromFile(String.Format(@"{0}" , listView1.Items[i].Tag)); //путь к файлу в tag.
imageList1.Images.Add(GetThmb(images , 128 , 128));
listView1.Items[i].Text = "";
listView1.Items[i].ImageIndex = i;
}
timer2.Enabled = false;
}
почему обработка в таймере??

Добавлено через 1 минуту
этот код прочитает все файлы в папке и если он является графическим добавит в listView

C#
1
2
3
4
5
6
7
8
9
10
DirectoryInfo dir = new DirectoryInfo("ПУТЬ ПАПКИ");
            foreach (FileInfo file in dir.GetFiles())
            {
                try
                {
                    this.imageList1.Images.Add(Image.FromFile(file.FullName));
                }
                catch{
                }
            }
0
24 / 24 / 9
Регистрация: 15.11.2010
Сообщений: 95
23.11.2010, 14:28  [ТС] 3
От проблемы долгой загрузки все равно не избавляет. В папке 200 jpg файлов, каждый весит примерно 3 Мб, пока он их все прочтет состариться можно. А в listview попадает 1500 файлов.
В винде даже с удаленным Thumbs.db, превьюшки прогружаются быстро.

Обработка в таймере временно.




C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void GetFiles(string path , TextWriter text)
            {   
             DirectoryInfo dir = new DirectoryInfo(path);
             FileInfo[] files = dir.GetFiles("*.jpg");
             foreach (DirectoryInfo d in dir.GetDirectories())
                 {
                  listView1.Groups.Add(new ListViewGroup(String.Format("{0}" , d.Name) , HorizontalAlignment.Center));  
                  GetFiles(String.Format(@"{0}{1}\" , path , d.Name) , null);
                  i++;            
                 }
                foreach (FileInfo f in files)
                {                
                 ListViewItem lvi = new ListViewItem(f.Name) { Tag = f.FullName , Group = listView1.Groups[i] };                 
                 listView1.Items.Add(lvi);
                
                }
            }
Забивает listview файлами.
0
681 / 595 / 138
Регистрация: 08.05.2009
Сообщений: 1,098
23.11.2010, 14:32 4
Цитата Сообщение от exlim Посмотреть сообщение
В папке 200 jpg фпйлов, каждый весит примерно 3 Мб, пока он их все прочтет состариться можно.
думаю с этим уже ничего не поделать....
а сколько примерно времени занимает
попробуй измерить так
C#
1
2
DateTime dt=DateTime.Now;//это напиши перед выполнением загрузки картинок
TimeSpan ts = DateTime.now - dt;//а это после
0
24 / 24 / 9
Регистрация: 15.11.2010
Сообщений: 95
23.11.2010, 15:26  [ТС] 5
На 2142 файлов 5 минут. И все это время программа висит, вот если бы был способ реализовать как в винде, или хотя бы использовать listview видимую область.
На 200 файлов 30 секунд.
Хотелось бы иметь возможность работать с программой пока она формируют превьюшки.
Или вытащить превьюшки из jpg. Но такое я видел только на c++ где-то давно.

Можно ли как то прогружать постепенно, не давая программе висеть?
0
681 / 595 / 138
Регистрация: 08.05.2009
Сообщений: 1,098
23.11.2010, 15:37 6
можешь прикрепить проект?

Добавлено через 4 минуты
C#
1
2
3
и еще попробуй загружать фамбнайлы картинок
 
Image thumbnailImage = image.GetThumbnailImage(64, 64, new Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero)
;
0
24 / 24 / 9
Регистрация: 15.11.2010
Сообщений: 95
23.11.2010, 15:52  [ТС] 7
Вот проект
0
Вложения
Тип файла: rar Eximage.rar (101.4 Кб, 102 просмотров)
24 / 24 / 9
Регистрация: 15.11.2010
Сообщений: 95
23.11.2010, 16:23  [ТС] 8
Добавлено через 5 минут
Цитата Сообщение от Бельфегор Посмотреть сообщение

Добавлено через 4 минуты
C#
1
2
3
и еще попробуй загружать фамбнайлы картинок
 
Image thumbnailImage = image.GetThumbnailImage(64, 64, new Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero)
;
12 секунд на 50 файлов. Вроде не много но опять же если файлов мало.
1:24 на 712 файлов.

Добавлено через 7 минут
Можно ли как то реализовать, прогрузку по 10 файлов, без подвисания формы?
В таком случаи идеальное сочетание, 10 файлов в 1 секунду + форма не виснет.
Поможет ли параллельный поток?
0
Почетный модератор
Эксперт .NET
8692 / 3644 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
23.11.2010, 16:26 9
exlim, без потоков, ты эту проблему не решишь... Я занимался подобным проектом (что-то вроде Adobe Lightroom) так там принцип я использовал такой:
1) Есть основной класс (в том случае это был контрол).
2) И есть второстепенный класс, который создает поток, и постоянно в этом потоке обрабатывает изображения.

Так вот в главном классе добавлялся элемент в коллекцию, но не само изображение изначально, и в тоже время добавлялся элемент во второстепенном потоке с путем до изображения. Поток обработал изображение и "передал" его в главный класс, который это изображение отрисовал.
0
24 / 24 / 9
Регистрация: 15.11.2010
Сообщений: 95
23.11.2010, 16:34  [ТС] 10
Вот потоки не совсем понимаю, как их использовать.
Не так давно начал на C# писать, и не использовал их никогда
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace Eximage
    { 
    public partial class Form1 : Form
        {
        int i = 0;
 
        public Form1()
            {
             InitializeComponent();
            }
 
 
private void GetFiles(string path , TextWriter text)
            {   
             DirectoryInfo dir = new DirectoryInfo(path);
             FileInfo[] files = dir.GetFiles("*.jpg");
             foreach (DirectoryInfo d in dir.GetDirectories())
                 {
                  listView1.Groups.Add(new ListViewGroup(String.Format("{0}" , d.Name) , HorizontalAlignment.Center));  
                  GetFiles(String.Format(@"{0}{1}\" , path , d.Name) , null);
                  i++;            
                 }
                foreach (FileInfo f in files)
                {    
                 ListViewItem lvi = new ListViewItem(f.Name) { Tag = f.FullName};                
                 listView1.Items.Add(lvi);
                }
            }
 
public void jump()
        {
        GetFiles(String.Format(@"{0}" , @"D:\- hd обойки -\анимашки\") , null);
        }
 
        private void Form1_Load(object sender , EventArgs e)
            {
             jump();
             toolStripStatusLabel1.Text = listView1.Items.Count.ToString();
             timer2.Enabled = true;
            }
 
    
 
private void listView1_SelectedIndexChanged(object sender , EventArgs e)
            {
             timer1.Enabled=true;
            }
 
private void timer1_Tick(object sender , EventArgs e)
            {
             if (listView1.SelectedItems.Count == 1)
                {
                 pictureBox1.Image = Image.FromFile(String.Format(@"{0}" , listView1.FocusedItem.Tag));
                }
             timer1.Enabled=false;
            }
        private static bool ThumbnailCallback()
            {
            return false;
            }
 
public void timer2_Tick(object sender , EventArgs e)
            {
             DateTime dt = DateTime.Now;
            
             for (int i = 0; i <7; i++)
                {               
                Image im = Image.FromFile(String.Format(@"{0}" , listView1.Items[i].Tag));
                Image thumbnailImage = im.GetThumbnailImage(100 , 50 , new Image.GetThumbnailImageAbort(ThumbnailCallback) , IntPtr.Zero);              
                imageList1.Images.Add(thumbnailImage);
                listView1.Items[i].ImageIndex = i;
                }
             
             TimeSpan ts = DateTime.Now - dt;
             toolStripStatusLabel2.Text = ts.ToString();
             
             timer2.Enabled = false;
            }
 
        
    }
            }
Весь код, если бы подсказали как использовать поток был бы премного благодарен.

Добавлено через 3 минуты
Цитата Сообщение от SSTREGG Посмотреть сообщение

Так вот в главном классе добавлялся элемент в коллекцию, но не само изображение изначально
Это уже сделано.
Цитата Сообщение от SSTREGG Посмотреть сообщение
и в тоже время добавлялся элемент во второстепенном потоке с путем до изображения. Поток обработал изображение и "передал" его в главный класс, который это изображение отрисовал.
а вот это не совсем понятно, последние мои попытки использовать поток упирались, что я пытаюсь обратиться к элементу созданному в основном потоке, но как решать такую проблему я так и не понял. Так как путь до файла храню в ListView.Items[].Tag
Не нашел достойных понятных примеров. =(
0
Почетный модератор
Эксперт .NET
8692 / 3644 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
23.11.2010, 16:46 11
Надо создавать 2 коллекции, одна у тебя есть - ListViewItemCollection, а вторая - это коллекция элементов, каждый из которых должен хранить какой-то идентификатор (чтобы определить к какому ListViewItem'у принадлежит), путь к изображению и Image (чтобы потом его передать в ListViewItem [к примеру]).

Поток должен обрабатывать 2ю коллекцию и грузить Image с диска в Item, после этого сообщать ListView'у о перерисовки элемента, и при перерисовке ListView должен грузить уже готовое изображение из памяти.

Тут нужна практика работы с потоками, иначе в конечном итоге будут довольно сильные косяки.
0
24 / 24 / 9
Регистрация: 15.11.2010
Сообщений: 95
23.11.2010, 16:54  [ТС] 12
Ну вот ту самую практику я и пытаюсь приобрести.
В принципе во втором потоке можно создать imagelist
Что я и попробовал сделать, но вот как его передать теперь в основной поток, если создаю я его в альтернативном.
0
Почетный модератор
Эксперт .NET
8692 / 3644 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
23.11.2010, 17:00 13
Цитата Сообщение от exlim Посмотреть сообщение
Ну вот ту самую практику я и пытаюсь приобрести.
Советую начать с чего-нибудь попроще, имхо... В общем я описал методику...
0
24 / 24 / 9
Регистрация: 15.11.2010
Сообщений: 95
23.11.2010, 17:21  [ТС] 14
Просто есть необходимость в подобном приложении.
Единственный вопрос как разрешить listview1 в альтернативном потоке.
0
Почетный модератор
Эксперт .NET
8692 / 3644 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
23.11.2010, 17:24 15
Это не избавит от подвисания формы, т.к. чтобы его отобразить на форме, тебе придется создавать форму в том же потоке.
0
24 / 24 / 9
Регистрация: 15.11.2010
Сообщений: 95
23.11.2010, 17:46  [ТС] 16
SSTREGG, спасибо за советы, вроде как начинает жить.
0
burning1ife
1446 / 1268 / 293
Регистрация: 21.09.2008
Сообщений: 3,439
Записей в блоге: 9
24.11.2010, 04:55 17
в WPF это делается так, и картинки грузяться в мгновение ока, независимо от их кол-ва, т.е. они подгружаются постепенно, по мере необходимости. Все благодаря свойству VirtualizingStackPanel.VirtualizationMode="Recycling"
XML
1
2
3
4
5
6
7
  <ListBox ScrollViewer.VerticalScrollBarVisibility="Visible" Name="lstImages" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="True">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Image Width="32" Height="32" Source="{Binding ImagePath}"></Image>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
0
burning1ife
1446 / 1268 / 293
Регистрация: 21.09.2008
Сообщений: 3,439
Записей в блоге: 9
24.11.2010, 05:07 18
Вот пример набросал.
Если принципиально, чтобы это был Windows Forms, то можно создать UserControl в WPF, а потом добавить его в свой проект.
0
Вложения
Тип файла: rar WpfApplication3.rar (5.1 Кб, 61 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2010, 05:07

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Некорректно отображаются превью картинок в папке
В какой-то момент превьюшки изображений в папках перестали отображаться как обычно. При этом галка...

Превью изображений
Как правильно уменьшить изображения в html по минимуму прибегая к javascript и css? У меня превью...

Работа с превью изображений
Делаю превьюхи в фотогалерее. Сначала imagecopyresized а потом вывожу через imagejpeg. На локальном...

Создание превью изображений
Наткнулся на такой скрипт, создает превью изображений как добиться чтобы под каждой превью была...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.