Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
85 / 77 / 13
Регистрация: 03.09.2009
Сообщений: 346

Скорость работы FillRectangle

20.07.2011, 22:11. Показов 4253. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Раз эта тема успешно решена, то можно задать тут вопрос связанный с графикой?

Например есть Bitmap 10x10 пикс. Рисую на нем с помощью Graphics.
Будет ли разница в скорости между:
C#
1
Graphics.FillRectangle(Brushes.Black, 0,0, 10,10);
и
C#
1
Graphics.FillRectangle(Brushes.Black, -10000, -10000, 10000,10000);
?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.07.2011, 22:11
Ответы с готовыми решениями:

Убрать заливку области | FillRectangle
Приветствую всех. Подскажите, пожалуйста, как убрать закрашенную область через FillRectangle не удаляя сам квадрат? P.S. только не...

Наложение цвета при использовании FillRectangle
Доброго времени суток Возникла необходимость закрасить область полупрозрачным цветом, для этого решил использовать метод...

FillRectangle, выделение памяти под объект Rectangle
Помогите, пожалуйста. Почему вот так не работает: Rectangle^ rect = gcnew Rectangle(20, 20, 200, 100); ...

9
 Аватар для umnick_kh
311 / 249 / 44
Регистрация: 06.12.2010
Сообщений: 527
20.07.2011, 22:56
SergBokh, а что, самому проверить никак?
Тоже самое для второго варианта, и сравнивай, что быстрее.
C#
1
2
3
4
5
DateTime dt1 = DateTime.Now;
Graphics.FillRectangle(Brushes.Black, 0,0, 10,10);
DateTime dt2 = DateTime.Now;
TimeSpan ts = dt2 - dt1;
MessageBox.Show(ts.Seconds.ToString());//Или Second, уже не помню точно.
1
85 / 77 / 13
Регистрация: 03.09.2009
Сообщений: 346
21.07.2011, 16:24  [ТС]
Как можно с помощью Graphics очистить прямоугольный участок изображения?
Очистить в смысле чтоб все пикселы стали прозрачными.
0
 Аватар для umnick_kh
311 / 249 / 44
Регистрация: 06.12.2010
Сообщений: 527
21.07.2011, 16:31
Попробуйте так, не проверял.
C#
1
2
           Graphics g = Graphics.FromImage(bmp);
           g.Clear(Color.Transparent);
1
185 / 188 / 17
Регистрация: 26.11.2010
Сообщений: 511
21.07.2011, 20:05
Я очень долго экспериментировал с графикой, и, скорее всего, на не-огромных битмапах будет быстрее FillRectangle. Если надо залить примерно такую область (на очень большом рисунке):
Code
1
2
3
4
5
6
XXXXX
XXXXX
OOOOO
OOOOO
OOOXX
XXXXX
То можно поиграться с переводом в массив byte[] и очищении уже его. Не гарантирую, что это будет быстрее.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
21.07.2011, 20:46
Цитата Сообщение от umnick_kh Посмотреть сообщение
SergBokh, а что, самому проверить никак?
Думаю лучше уж сравнивать скорость так:
C#
1
2
3
4
            Stopwatch sw = Stopwatch.StartNew();
            Graphics.FillRectangle(Brushes.Black, 0,0, 10,10); //суть понятна думаю, эта строка вроде не должна по идее работать
            sw.Stop();
            MessageBox.Show(this, sw.Elapsed.TotalMilliseconds.ToString());
2
85 / 77 / 13
Регистрация: 03.09.2009
Сообщений: 346
21.07.2011, 23:16  [ТС]
umnick_kh, да так получилось, спс. Только нужно предварительно задать свойство Graphics.Clip так, чтобы очистился нужный регион, а не весь рисунок.


Killster, Перевод в массив byte[] это всмысле что-то типа LockBits? Слишком долго по времени получается сами процедуры Lock-Unlock. Мне довольно критична скорость.
Была мысль, что если заблокировать картинку с пом. LockBits и писать сразу в нее новые данные то они сразу будут отображаться на соответствующем PictureBox (на экране то есть).
Но неполучается - при попытке обновить PictureBox.Invalidate() вылетает ошибка. Пока не сделаешь Unlock.


Еще можно использовать BitBlt, но у меня не получилось заставить ее работать.
0
185 / 188 / 17
Регистрация: 26.11.2010
Сообщений: 511
21.07.2011, 23:31
Цитата Сообщение от SergBokh Посмотреть сообщение
Killster, Перевод в массив byte[] это всмысле что-то типа LockBits? Слишком долго по времени получается сами процедуры Lock-Unlock. Мне довольно критична скорость.
Была мысль, что если заблокировать картинку с пом. LockBits и писать сразу в нее новые данные то они сразу будут отображаться на соответствующем PictureBox (на экране то есть).
Но неполучается - при попытке обновить PictureBox.Invalidate() вылетает ошибка. Пока не сделаешь Unlock..
Я когда для себя писал класс FastBitmap (для нужд) было быстрее, чем вызов DrawLine
С учетом Lock-Unlock, конечно.

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
93
94
95
96
97
98
99
100
101
102
103
104
105
#region Usings
 
using System ;
using System.Drawing ;
using System.Drawing.Imaging ;
using System.Runtime.InteropServices ;
 
#endregion
 
namespace All_clause.Imaging
{
    internal class FastBitmap
    {
        private const int BitsPerPixel = 4 ;
 
        private Size _imageSize ;
        private byte [ ] _store ;
 
        public FastBitmap ( )
        {
            _imageSize = new Size(1, 1) ; // 1 пиксел.
            _store = new byte[ BitsPerPixel ] ;
        }
 
        public FastBitmap (Bitmap original)
        {
            _imageSize = new Size(Image.Width, Image.Height) ;
            _store = new byte[ BitsPerPixel * _imageSize.Width * _imageSize.Height ] ;
            BitmapData imageData = original.LockBits(new Rectangle(0, 0, original.Width, original.Height),
                                                     ImageLockMode.ReadWrite, original.PixelFormat) ;
            Marshal.Copy(imageData.Scan0, _store, 0, imageData.Stride * imageData.Height) ;
            original.UnlockBits(imageData) ;
        }
 
        public FastBitmap (int width, int height)
        {
            _imageSize = new Size(width, height) ;
            _store = new byte[ BitsPerPixel * width * height ] ;
        }
 
        public Bitmap Image
        {
            get
            {
                Bitmap im = new Bitmap(_imageSize.Width, _imageSize.Height) ;
                BitmapData imageData = im.LockBits(new Rectangle(0, 0, im.Width, im.Height),
                                                   ImageLockMode.ReadWrite, im.PixelFormat) ;
                Marshal.Copy(_store, 0, imageData.Scan0, _store.Length) ;
                im.UnlockBits(imageData) ;
                return im ;
            }
            set
            {
                BitmapData imageData = value.LockBits(new Rectangle(0, 0, value.Width, value.Height),
                                                      ImageLockMode.ReadWrite, value.PixelFormat) ;
                int imageByteCount = imageData.Stride * imageData.Height ;
                _store = new byte[ imageByteCount ] ;
                _imageSize = new Size(value.Width, value.Height) ;
                Marshal.Copy(imageData.Scan0, _store, 0, imageByteCount) ;
                value.UnlockBits(imageData) ;
            }
        }
 
        public Color GetPixel (int x, int y)
        {
            int pointBase = y * _imageSize.Width * BitsPerPixel + x * 4 ;
            if ( _store.Length < pointBase + 3 ) throw new ArgumentException( ) ;
            byte r = _store [pointBase + 2] ;
            byte g = _store [pointBase + 1] ;
            byte b = _store [pointBase] ;
            byte a = _store [pointBase + 3] ;
            return Color.FromArgb(a, r, g, b) ;
        }
 
        public void SetPixel (int x, int y, Color color)
        {
            int pointBase = y * _imageSize.Width * BitsPerPixel + x * BitsPerPixel ;
            if ( _store.Length < pointBase + 3 ) throw new ArgumentException( ) ;
            _store [pointBase] = color.B ;
            _store [pointBase + 1] = color.G ;
            _store [pointBase + 2] = color.R ;
            _store [pointBase + 3] = color.A ;
        }
 
        public void SetPixel (int x, int y, byte a, byte r, byte g, byte b)
        {
            int pointBase = y * _imageSize.Width * BitsPerPixel + x * BitsPerPixel ;
            if ( _store.Length < pointBase + 3 ) throw new ArgumentException( ) ;
            _store [pointBase] = b ;
            _store [pointBase + 1] = g ;
            _store [pointBase + 2] = r ;
            _store [pointBase + 3] = a ;
        }
 
        public void SetPixel (int x, int y, byte r, byte g, byte b)
        {
            int pointBase = y * _imageSize.Width * BitsPerPixel + x * BitsPerPixel ;
            if ( _store.Length < pointBase + 3 ) throw new ArgumentException( ) ;
            _store [pointBase] = b ;
            _store [pointBase + 1] = g ;
            _store [pointBase + 2] = r ;
            _store [pointBase + 3] = 255 ;
        }
    }
}
P.S. Ни в коем случае нельзя делать Lock-unlock самой картинки - обязательно нужно делать клон! Я не очень понимаю, почему, но так реально быстрее
0
85 / 77 / 13
Регистрация: 03.09.2009
Сообщений: 346
21.07.2011, 23:48  [ТС]
Вроде бы можно сразу вносить изменения напрямую в заблокированную картинку без копирования байтов во временный массив (Marshal.Copy...)
Но при этом нельзя пытаться обновлять контроллы, где она используется.

По идее должно быть быстрей, ведь нет копирования туда-обратно. Но вот сам процесс блокирования - разблокирования занимает время. Интересно, как работает Graphics при изменении картинки?
0
185 / 188 / 17
Регистрация: 26.11.2010
Сообщений: 511
21.07.2011, 23:56
Цитата Сообщение от SergBokh Посмотреть сообщение
Вроде бы можно сразу вносить изменения напрямую в заблокированную картинку без копирования байтов во временный массив (Marshal.Copy...)
Но при этом нельзя пытаться обновлять контроллы, где она используется.
Поэтому мы работаем с копией. Контролы - это как отдельный поток - тут лучше с локами не играться.

Цитата Сообщение от SergBokh Посмотреть сообщение
По идее должно быть быстрей, ведь нет копирования туда-обратно. Но вот сам процесс блокирования - разблокирования занимает время. Интересно, как работает Graphics при изменении картинки?
Графика оптимизирована для работы на Bitmap'ах - быстрее уже вряд ли получится. Для таких вещей лучше просто работать с копией картинки где-нибудь у себя в закромах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.07.2011, 23:56
Помогаю со студенческими работами здесь

Создание функции, рисующей FillRectangle. Visual c++ /clr
Visual c++ , Windows Forms. Пытаюсь создать функцию, которая бы рисовала FillRectangle. void paintrec (int x,int y) { ...

Скорость работы
Ко нибуд знает при открытии сайта грузит быстро а при повторным долго и так по разному. как можно вообще отследить нагрузку? кто в этом...

Скорость работы
НАрод, подскажите, вот выбираю ноутбук. От чего зависит быстрая работа ноутбука? быстрое открывание программ, обработки и т.д. Слышал что...

Скорость работы
Доброго времени суток! У меня такая задача. Я конечно не ожидаю ответа, но может кто-то и что-то знает! Короче, как быстро purebasic...

Скорость работы EF
Здравствуйте! Переделывал тут одну программу работающую с SQL на подключенном уровне(простейшие операции, обработка значений и запись их в...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru