Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99

Опримизация алгоритма

06.11.2011, 16:28. Показов 1841. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем ситуация такая, пишу приложение, которое бинаризирует цветную картинку методом "Бинаризация по площади"
В кратце про алгоритм:
Загружаю изображение.
Считываю яркость каждого пиксля, и записываю в массив masIA
Далее бегаю по массиву masIA[i,j] и считываю яркости окружающих, исходный пиксель[i,j], пикслей, и нахожу среднее значение,записываю в массив masSr
Нахожу диссперсию рассматриваемого пиксля(долго рассписывать как)
В общем вопрос такой, программа при разрешении изображения более 100x100 работает очень долгл...
Народ подскажите как оптимизировать вот весь код... спс...
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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;
 
namespace MPO_Binary
{
    public partial class Form1 : Form
    {
        public int[] MasI;
        public string FileName;
        public Bitmap bmp;
        public Form1()
        {
            InitializeComponent();
            Bitmap B = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = B;
        }
        private static int[] GetHistogramm(Bitmap image)
        {
            int[] result = new int[256];
                for (int x = 0; x < image.Width; x++)
                    for (int y = 0; y < image.Height; y++)
                    {
                        int i = (int)(255 * image.GetPixel(x, y).GetBrightness());
                        result[i]++;
                    }
 
            return result;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                FileName = openFileDialog.FileName;
                bmp = new Bitmap(FileName);
                MasI = GetHistogramm(bmp);
                Graphics g = Graphics.FromImage(pictureBox1.Image);
                double k = (double)180 / (double)MasI.Max();
                for (int i = 0; i <= 255; i++)
                  g.DrawLine(new Pen(new SolidBrush(Color.Black)), i, 180, i, 180 - (float)(MasI[i] * k)); 
                pictureBox1.Invalidate();
                button2.Enabled = true;
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            int[,] masIA = new int[bmp.Width, bmp.Height];
            int[,] masSr = new int[bmp.Width, bmp.Height];
            int[,] masD = new int[bmp.Width, bmp.Height];
            int temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8;
            for (int x = 0; x < bmp.Width; x++)
                for (int y = 0; y < bmp.Height; y++)
                    masIA[x, y] = (int)(255 * bmp.GetPixel(x, y).GetBrightness());
            for (int x = 0; x < bmp.Width; x++)
                for (int y = 0; y < bmp.Height; y++)
                {
                    
                    try
                    { temp1 = masIA[x - 1, y - 1]; }
                    catch
                    { temp1 = 255; }
 
                    try
                    { temp2 = masIA[x - 1, y]; }
                    catch
                    { temp2 = 255; }
 
                    try
                    { temp3 = masIA[x - 1, y+1]; }
                    catch
                    { temp3 = 255; }
 
                    try
                    { temp4 = masIA[x , y + 1]; }
                    catch
                    { temp4 = 255; }
 
                    try
                    { temp5 = masIA[x + 1, y + 1]; }
                    catch
                    { temp5 = 255; }
 
                    try
                    { temp6 = masIA[x + 1, y ]; }
                    catch
                    { temp6 = 255; }
 
                    try
                    { temp7 = masIA[x + 1, y - 1]; }
                    catch
                    { temp7 = 255; }
 
                    try
                    { temp8 = masIA[x, y - 1]; }
                    catch
                    { temp8 = 255; }
                    masSr[x, y] = (int)((temp1 + temp2 + temp3 + temp4 + temp5 + temp6 + temp7 + temp8) / 8);
                    masD[x, y] =(((masSr[x, y] - temp1) * (masSr[x, y] - temp1)) +
                                 ((masSr[x, y] - temp2) * (masSr[x, y] - temp2)) +
                                 ((masSr[x, y] - temp3) * (masSr[x, y] - temp3)) +
                                 ((masSr[x, y] - temp4) * (masSr[x, y] - temp4)) +
                                 ((masSr[x, y] - temp5) * (masSr[x, y] - temp5)) +
                                 ((masSr[x, y] - temp6) * (masSr[x, y] - temp6)) +
                                 ((masSr[x, y] - temp7) * (masSr[x, y] - temp7)) +
                                 ((masSr[x, y] - temp8) * (masSr[x, y] - temp8)))/7;
                }
            Bitmap BinBMP = new Bitmap(bmp);
            for (int x = 0; x < BinBMP.Width; x++)
                for (int y = 0; y < BinBMP.Height; y++)
                {
                    if (masIA[x, y] < masSr[x, y] + (int)((double)0.3 * (double)masD[x, y]))
                        BinBMP.SetPixel(x, y, Color.Black);
                    else
                        BinBMP.SetPixel(x, y, Color.White);
                }
            Form2 dlg = new Form2();
            dlg.pictureBox1.Image = BinBMP;
            dlg.Show();
            dlg.pictureBox1.Invalidate();
        }
    }
}
Ну тут и построение гистограммы, сама бинаризация происходит по событию button2_Click(object sender, EventArgs e)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2011, 16:28
Ответы с готовыми решениями:

Программа для сравнения производительности необобщенного алгоритма ArrayList и обобщенного алгоритма List
Доброе время суток форумчане! Наткнулся я в книжке на этот код, решил проверить у себя, и получилось так, что код написан с ошибками в: ...

Реализуйте на практике 2 алгоритма поиска и 2 алгоритма сортировки. Результаты сравните
Всем привет! Я в С++ абсолютный чайнег, поэтому за дебильные вопросы сапогами не пинайте))) в общем есть код работающий в борланде....

Составить блок – схему алгоритма и определить, что выводится в результате выполнения следующего алгоритма
Всем привет. Помогите плиз. Составить блок – схему алгоритма и определить, что выводится в результате выполнения следующего алгоритма: 1....

15
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.11.2011, 16:47
Цитата Сообщение от xWinDx Посмотреть сообщение
C#
1
2
image.GetPixel(x, y);
BinBMP.SetPixel(x, y, Color.Black);
Потому и долго.

Вам сюда: Перебор пикселей на изображениях занимает очень много времени
1
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
06.11.2011, 16:53  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Спасибо конечно, сделаю по вашему способу, но тут больше времени идёт(ПРОВЕРЯЛ) на вот этот кусок
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
for (int x = 0; x < bmp.Width; x++)
                for (int y = 0; y < bmp.Height; y++)
                {
                    
                    try
                    { temp1 = masIA[x - 1, y - 1]; }
                    catch
                    { temp1 = 255; }
 
                    try
                    { temp2 = masIA[x - 1, y]; }
                    catch
                    { temp2 = 255; }
 
                    try
                    { temp3 = masIA[x - 1, y+1]; }
                    catch
                    { temp3 = 255; }
 
                    try
                    { temp4 = masIA[x , y + 1]; }
                    catch
                    { temp4 = 255; }
 
                    try
                    { temp5 = masIA[x + 1, y + 1]; }
                    catch
                    { temp5 = 255; }
 
                    try
                    { temp6 = masIA[x + 1, y ]; }
                    catch
                    { temp6 = 255; }
 
                    try
                    { temp7 = masIA[x + 1, y - 1]; }
                    catch
                    { temp7 = 255; }
 
                    try
                    { temp8 = masIA[x, y - 1]; }
                    catch
                    { temp8 = 255; }
                    masSr[x, y] = (int)((temp1 + temp2 + temp3 + temp4 + temp5 + temp6 + temp7 + temp8) / 8);
                    masD[x, y] =(((masSr[x, y] - temp1) * (masSr[x, y] - temp1)) +
                                 ((masSr[x, y] - temp2) * (masSr[x, y] - temp2)) +
                                 ((masSr[x, y] - temp3) * (masSr[x, y] - temp3)) +
                                 ((masSr[x, y] - temp4) * (masSr[x, y] - temp4)) +
                                 ((masSr[x, y] - temp5) * (masSr[x, y] - temp5)) +
                                 ((masSr[x, y] - temp6) * (masSr[x, y] - temp6)) +
                                 ((masSr[x, y] - temp7) * (masSr[x, y] - temp7)) +
                                 ((masSr[x, y] - temp8) * (masSr[x, y] - temp8)))/7;
                }
Как бы мне его оптимизировать?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.11.2011, 16:56
Цитата Сообщение от xWinDx Посмотреть сообщение
try
{ temp1 = masIA[x - 1, y - 1]; }
catch
{ temp1 = 255; }
try
{ temp2 = masIA[x - 1, y]; }
catch
{ temp2 = 255; }
try
{ temp3 = masIA[x - 1, y+1]; }
catch
{ temp3 = 255; }
try
{ temp4 = masIA[x , y + 1]; }
catch
{ temp4 = 255; }
try
{ temp5 = masIA[x + 1, y + 1]; }
catch
{ temp5 = 255; }
try
{ temp6 = masIA[x + 1, y ]; }
catch
{ temp6 = 255; }
try
{ temp7 = masIA[x + 1, y - 1]; }
catch
{ temp7 = 255; }
try
{ temp8 = masIA[x, y - 1]; }
catch
{ temp8 = 255; }
Суровый кусочек.
Можете в двух словах пояснить, что вы пытаетесь тут сделать?
А так в любом случае лучше делайте проверку, чем отлов исключения, так как создание объекта исключения - очень трудоемкий процесс.

И избавьтесь уже от китайских переменных tempN, сделайте один массив
1
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
06.11.2011, 17:00  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Суровый кусочек.
Можете в двух словах пояснить, что вы пытаетесь тут сделать?
А так в любом случае лучше делайте проверку, чем отлов исключения, так как создание объекта исключения - очень трудоемкий процесс.
Ну как бы мне нужно окружения пиксля, а если пиксель [0,0](то есть крайний), то [0-1,0-1] и др.
выходят за рамки изображения, мне нужно считать их белыми... вот так и получился такой код)

Ну когда массив это дольше, хз почему. предпалогаю что ему бегать по масиву сложнее...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.11.2011, 17:06
Цитата Сообщение от xWinDx Посмотреть сообщение
Ну когда массив это дольше
Разница в одну инструкцию, так что вы скорее всего неправильно его используете.

Замените отлов исключений на обычные условия проверки границ массива и будет вам счастье.
1
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
06.11.2011, 17:09  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Разница в одну инструкцию, так что вы скорее всего неправильно его используете.

Замените отлов исключений на обычные условия проверки границ массива и будет вам счастье.
Спасибо, счас сделаю всё что вы мне насоветовали... посмотрю что получилось....
0
7 / 7 / 2
Регистрация: 18.10.2011
Сообщений: 40
06.11.2011, 17:22
Цитата Сообщение от xWinDx Посмотреть сообщение
Ну как бы мне нужно окружения пиксля, а если пиксель [0,0](то есть крайний), то [0-1,0-1] и др.
выходят за рамки изображения, мне нужно считать их белыми... вот так и получился такой код)

Ну когда массив это дольше, хз почему. предпалогаю что ему бегать по масиву сложнее...
Я когда решал подобную задачу(сапер),делал очень простую вещь:добавлял по краям 0.(те расширял массив)
То есть к примеру вот такой массивчик:
1 1 1
2 2 2
3 3 3
Станет таким:
0 0 0 0 0
0 1 1 1 0
0 2 2 2 0
0 3 3 3 0
0 0 0 0 0
В вашем случае будут не 0, а белый пиксель.
Но также можно делать проверку границ, как сказано выше
1
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
06.11.2011, 18:05  [ТС]
Цитата Сообщение от Overdoser Посмотреть сообщение
Я когда решал подобную задачу(сапер),делал очень простую вещь:добавлял по краям 0.(те расширял массив)
То есть к примеру вот такой массивчик:
1 1 1
2 2 2
3 3 3
Станет таким:
0 0 0 0 0
0 1 1 1 0
0 2 2 2 0
0 3 3 3 0
0 0 0 0 0
В вашем случае будут не 0, а белый пиксель.
Но также можно делать проверку границ, как сказано выше
Думал над таким вариантом, но тут гемороя больше...
Сделал проверку действительно существенно быстрее, но всё равно не идеально, при больших изображения...
Переделал так:
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
 private void button2_Click(object sender, EventArgs e)
        {
            int[,] masIA = new int[bmp.Width, bmp.Height];
            int[,] masSr = new int[bmp.Width, bmp.Height];
            int[,] masD = new int[bmp.Width, bmp.Height];
            int[] temp = new int[8];
            for (int x = 0; x < bmp.Width; x++)
                for (int y = 0; y < bmp.Height; y++)
                    masIA[x, y] = (int)(255 * bmp.GetPixel(x, y).GetBrightness());
            for (int x = 0; x < bmp.Width; x++)
                for (int y = 0; y < bmp.Height; y++)
                {
                    
                    if((x-1 >= 0)&&(y-1)>= 0)
                    temp[0] = masIA[x - 1, y - 1]; 
                    else
                    temp[0] = 255; 
 
                    if(x-1 >= 0)
                    temp[1] = masIA[x - 1, y]; 
                    else
                    temp[1] = 255;
 
                    if ((x - 1 >= 0) && ((y + 1) < bmp.Height))
                    temp[2] = masIA[x - 1, y+1];
                    else
                    temp[2] = 255;
 
                    if((y + 1) < bmp.Height)
                    temp[3] = masIA[x , y + 1]; 
                    else
                    temp[3] = 255;
 
                    if (((y + 1) < bmp.Height) && ((x + 1) < bmp.Width))
                    temp[4] = masIA[x + 1, y + 1];
                    else
                    temp[4] = 255;
 
                    if ((x + 1) < bmp.Width)
                    temp[5] = masIA[x + 1, y ]; 
                    else
                    temp[5] = 255;
 
                    if (((y - 1) >= 0) && ((x + 1) < bmp.Width))
                    temp[6] = masIA[x + 1, y - 1]; 
                    else
                    temp[6] = 255;
 
                    if((y-1)>= 0)
                    temp[7] = masIA[x, y - 1]; 
                    else
                    temp[7] = 255;
 
                    for (int t = 0; t < 8; t++)
                        masSr[x, y] += temp[t];
                    masSr[x, y] = (int)(masSr[x, y] / 8);
                    for (int t = 0; t < 8; t++)
                        masD[x, y] += ((masSr[x, y] - temp[t]) * (masSr[x, y] - temp[t]));
                    masD[x, y] = (int)(masD[x, y] / 7);            
                }
            Bitmap BinBMP = new Bitmap(bmp);
            for (int x = 0; x < BinBMP.Width; x++)
                for (int y = 0; y < BinBMP.Height; y++)
                {
                    if (masIA[x, y] < masSr[x, y] + (int)((double)0.3 * (double)masD[x, y]))
                        BinBMP.SetPixel(x, y, Color.Black);
                    else
                        BinBMP.SetPixel(x, y, Color.White);
                }
            Form2 dlg = new Form2();
            dlg.pictureBox1.Image = BinBMP;
            dlg.Show();
            dlg.pictureBox1.Invalidate();
        }
Может у кого ещё какие варианты есть?

Добавлено через 15 минут
kolorotur, спасибо вам ещё раз... Всё таки думаю тормаза из-за "Сета и Гета"...
Почитал ваш линк, ну что-то не понел нихрена... как мне используя ваш метод, получить матрицу яркостей изображения?
Я так понимаю вашим методом это будет гораздо быстрее,чем этим?:
C#
1
2
3
for (int x = 0; x < bmp.Width; x++)
                for (int y = 0; y < bmp.Height; y++)
                    masIA[x, y] = (int)(255 * bmp.GetPixel(x, y).GetBrightness());
Ну и естественно как вашим методом задать пиксель?
Заранее благодарю.
0
Level 2
 Аватар для FakiR
401 / 275 / 48
Регистрация: 22.11.2010
Сообщений: 785
Записей в блоге: 1
06.11.2011, 18:10
xWinDx, Аналоги для GetPixel/SetPixel
0
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
07.11.2011, 18:26  [ТС]
Кое как разодрался вставил в своё приложение вот этот класс
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace MPO_Binary
{
    public unsafe class UnsafeBitmap
    {
        Bitmap bitmap;
        int width;
        BitmapData bitmapData = null;
        Byte* pBase = null;
 
        public UnsafeBitmap(Bitmap bitmap)
        {
            this.bitmap = new Bitmap(bitmap);
        }
 
        public UnsafeBitmap(int width, int height)
        {
            this.bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
        }
 
        public void Dispose()
        {
            bitmap.Dispose();
        }
 
        public Bitmap Bitmap
        {
            get
            {
                return (bitmap);
            }
        }
 
        private Point PixelSize
        {
            get
            {
                GraphicsUnit unit = GraphicsUnit.Pixel;
                RectangleF bounds = bitmap.GetBounds(ref unit);
 
                return new Point((int)bounds.Width, (int)bounds.Height);
            }
        }
 
        public void LockBitmap()
        {
            GraphicsUnit unit = GraphicsUnit.Pixel;
            RectangleF boundsF = bitmap.GetBounds(ref unit);
            Rectangle bounds = new Rectangle((int)boundsF.X,
       (int)boundsF.Y,
       (int)boundsF.Width,
       (int)boundsF.Height);
            width = (int)boundsF.Width * sizeof(PixelData);
            if (width % 4 != 0)
            {
                width = 4 * (width / 4 + 1);
            }
            
            bitmapData =
       bitmap.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
 
            pBase = (Byte*)bitmapData.Scan0.ToPointer();
        }
 
        public PixelData GetPixel(int x, int y)
        {
            PixelData returnValue = * PixelAt(x, y);
            return returnValue;
        }
 
        public void SetPixel(int x, int y, PixelData colour)
        {
            PixelData* pixel = PixelAt(x, y);
            *pixel = colour;
        }
 
        public void UnlockBitmap()
        {
            bitmap.UnlockBits(bitmapData);
            bitmapData = null;
            pBase = null;
        }
        public PixelData* PixelAt(int x, int y)
        {
            return (PixelData*)(pBase + y * width + x * sizeof(PixelData));
        }
    }
    public struct PixelData
    {
        public byte blue;
        public byte green;
        public byte red;
    }
 
}
На при вызове GetPixel, компилятор ругается на
C#
1
 PixelData returnValue = * PixelAt(x, y);
Мол "Object reference not set to an instance of an object."
Может кто подскажет в чём дело?
З.Ы.
С указателями вообще не дружу)))

Добавлено через 13 минут
И при вызове SetPixel, ругается на
C#
1
*pixel = colour;
Мол "Object reference not set to an instance of an object."

Добавлено через 16 часов 23 минуты
Help me! UP

Добавлено через 5 часов 35 минут
Help me! UP
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.11.2011, 12:04
Цитата Сообщение от xWinDx Посмотреть сообщение
Object reference not set to an instance of an object
F9, F10, F11 в помощь
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
08.11.2011, 13:37
вот из личных запасов класс..по сути тоже, но для 24 и 32 битных изображений и полностью протестированный
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
using System;
using System.Drawing;
using System.Drawing.Imaging;
 
namespace OnaxLibrary.BitmapProcessing
{
    public static class BitmapExtension
    {
        public static FastBitmap ToFastBitmap(this Bitmap image)
        {
            return FastBitmap.Create(image);
        }
    }
 
    public abstract unsafe class FastBitmap : IDisposable
    {
        protected readonly Bitmap workingBitmap;
        protected BitmapData bitmapData;
        private bool locked;
        protected Byte* pBase = null;
 
        protected FastBitmap(Bitmap workingBitmap)
        {
            if (workingBitmap == null)
                throw new ArgumentNullException("workingBitmap");
 
            this.workingBitmap = workingBitmap;
        }
 
        #region IDisposable Members
 
        public void Dispose()
        {
            if (locked)
            {
                UnlockPixels();
            }
        }
 
        #endregion
 
        public static FastBitmap Create(Bitmap image)
        {
            switch (image.PixelFormat)
            {
                case PixelFormat.Format32bppArgb:
                    return new FastBitmap32bppArgb(image);
 
                case PixelFormat.Format32bppRgb:
                    return new FastBitmap32bppArgb(image, true);
 
                case PixelFormat.Format24bppRgb:
                    return new FastBitmap24bppRgb(image);
 
                case PixelFormat.Format8bppIndexed:
                    return new FastBitmap8bppIndexed(image);
            }
 
            throw new BadImageFormatException("Такой тип изображений не поддерживается");
        }
 
        public virtual void LockPixels()
        {
            var bounds = new Rectangle(Point.Empty, workingBitmap.Size);
            bitmapData = workingBitmap.LockBits(bounds, ImageLockMode.ReadWrite, workingBitmap.PixelFormat);
            pBase = (Byte*)bitmapData.Scan0.ToPointer();
            locked = true;
        }
 
        public virtual void UnlockPixels()
        {
            workingBitmap.UnlockBits(bitmapData);
            bitmapData = null;
            pBase = null;
            locked = false;
        }
 
        public abstract Color GetPixel(int x, int y);
        public abstract void SetPixel(int x, int y, Color color);
 
        //private void Valid(int x, int y)
        //{
        //    if (x < 0) throw new ArgumentOutOfRangeException("x"); 
        //    if (y < 0) throw new ArgumentOutOfRangeException("y"); 
        //    if (x > bitmapData.Width) throw new ArgumentOutOfRangeException("x > bitmapData.Width");
        //    if (y > bitmapData.Height) throw new ArgumentOutOfRangeException("y > bitmapData.Height");  
        //}
 
        #region Nested type: FastBitmap24bppRgb
 
        private class FastBitmap24bppRgb : FastBitmap
        {
            private PixelData24* pixelData24 = null;
 
            public FastBitmap24bppRgb(Bitmap image)
                : base(image)
            {
            }
 
            public override Color GetPixel(int x, int y)
            {
                pixelData24 = (PixelData24*)(pBase + y * bitmapData.Stride + x * 3);
                return Color.FromArgb(pixelData24->red, pixelData24->green, pixelData24->blue);
            }
 
            public override void SetPixel(int x, int y, Color color)
            {
                var data = (PixelData24*)(pBase + y * bitmapData.Stride + x * 3);
                data->red = color.R;
                data->green = color.G;
                data->blue = color.B;
            }
 
            #region Nested type: PixelData24
 
            private struct PixelData24
            {
                public byte blue;
                public byte green;
                public byte red;
 
                public override string ToString()
                {
                    return "(" + 255 + ", " + red + ", " + green + ", " + blue + ")";
                }
            }
 
            #endregion
        }
 
        #endregion
 
        #region Nested type: FastBitmap32bppArgb
 
        private class FastBitmap32bppArgb : FastBitmap
        {
            private readonly bool noAlpha;
            private PixelData32* pixelData32 = null;
 
            public FastBitmap32bppArgb(Bitmap inputBitmap, bool noAlpha = false)
                : base(inputBitmap)
            {
                this.noAlpha = noAlpha;
            }
 
            public override Color GetPixel(int x, int y)
            {
                pixelData32 = (PixelData32*)(pBase + y * bitmapData.Stride + x * 4);
 
                if (noAlpha)
                    return Color.FromArgb(pixelData32->red, pixelData32->green, pixelData32->blue);
 
                return Color.FromArgb(pixelData32->alpha, pixelData32->red, pixelData32->green, pixelData32->blue);
            }
 
 
            public override void SetPixel(int x, int y, Color color)
            {
                var data = (PixelData32*)(pBase + y * bitmapData.Stride + x * 4);
 
                if (noAlpha)
                    data->alpha = 255;
 
                data->alpha = color.A;
                data->red = color.R;
                data->green = color.G;
                data->blue = color.B;
            }
 
            #region Nested type: PixelData32
 
            private struct PixelData32
            {
                public byte blue;
                public byte green;
                public byte red;
                public byte alpha;
 
                public override string ToString()
                {
                    return "(" + alpha + ", " + red + ", " + green + ", " + blue + ")";
                }
            }
 
            #endregion
        }
 
        #endregion
 
        #region Nested type: FastBitmap8bppIndexed
 
        private class FastBitmap8bppIndexed : FastBitmap
        {
            public FastBitmap8bppIndexed(Bitmap image)
                : base(image)
            {
            }
 
            public override Color GetPixel(int x, int y)
            {
                byte value = *(pBase + y * bitmapData.Stride + x);
                //var debugTemp = workingBitmap.Palette.Entries[value];
                //return debugTemp;
                return workingBitmap.Palette.Entries[value];
            }
 
            [Obsolete("медленней чем оригинальный Bitmap.SetPixel")]
            public override void SetPixel(int x, int y, Color color)
            {
                for (byte i = 0; i < workingBitmap.Palette.Entries.Length; i++)
                {
                    Color col = workingBitmap.Palette.Entries[i];
                    if (col == color)
                    {
                        *(pBase + y * bitmapData.Stride + x) = i;
                        return;
                    }
                }
 
                throw new Exception("Bad color, avaliable only 256 colors from image.Palette.Entries");
            }
        }
 
        #endregion
    }
 
 
}
пользоваться
C#
1
2
3
4
5
6
            using (FastBitmap fb = FastBitmap.Create(you_image))
            {
                fb.LockPixels();
 
                //do something 
            }
0
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
08.11.2011, 13:42  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
F9, F10, F11 в помощь
Я понимаю, что это за ошибка!!!! Я не знаю как её исправить! так как с указателями не дружу... и желания разбирать нету!

m0nax, Спасибо посмотрим
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.11.2011, 13:57
xWinDx, у тебя неинициализирован экземпляр класса, а вот почему он неинициализирован, смотри отладчиком
0
7 / 7 / 1
Регистрация: 28.03.2010
Сообщений: 99
08.11.2011, 14:09  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
xWinDx, у тебя неинициализирован экземпляр класса, а вот почему он неинициализирован, смотри отладчиком
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public int[] MasI;
        public string FileName;
        public Bitmap bmp;
        //***********
        public UnsafeBitmap UB;
        //***********
        PixelData PDBlack;
        PixelData PDWhite;
        public Form1()
        {
            InitializeComponent();
            Bitmap B = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = B;
            PDBlack = new PixelData();
            PDBlack.blue = 0; PDBlack.red = 0; PDBlack.green = 0;
            PDWhite = new PixelData();
            PDWhite.blue = 255; PDWhite.red = 255; PDWhite.green = 255;
            //***********
            UB = new UnsafeBitmap(B);
            //***********
            
        }
Вот так, вроде правильно инициализировал?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2011, 14:09
Помогаю со студенческими работами здесь

сравнения исходный и рекуррентного алгоритма, время алгоритма
Всем здравствуйте. Есть формула tic a = 30; for n = 1:1:100; u1(n) = sin(a*n); u2(n) = cos(a*n); end; toc u=zeros(1,100);...

Понятие трудоёмкости алгоритма Понятие эффективного алгоритма
Понятие трудоёмкости алгоритма. Классификация алгоритмов на основе функции трудоёмкости. Методика анализа трудоёмкости основных...

Понятие трудоёмкости алгоритма. Понятие эффективного алгоритма
Понятие трудоёмкости алгоритма. Классификация алгоритмов на основе функции трудоёмкости. Методика анализа трудоёмкости основных...

Сокращение алгоритма
Здравствуйте. Помогите с сокращением кода, пожалуйста. Только без использования каких-либо библиотек. Спасибо. Найти все натуральные...

Реализация алгоритма
Всем привет! Подскажите плиз,как можно реализовать алгоритм. Есть поле,которое может принемать любой размер,к примеру такое ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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