phil.o
В дополнение к решению 1 я хотел бы обратить ваше внимание на несколько вопросов:
1. Вам не нужно pix
переменная, или, по крайней мере, не в том фрагменте кода, который вы показали. Удаление копии может сэкономить несколько циклов (но это тоже не будет радикальным улучшением).
2. Вам не нужно a
переменная, так как вас не интересует Альфа-значение. Удаление его сэкономит изрядное количество циклов, так как его назначение выполняется внутри ваших вложенных циклов for. r
, g
и b
переменные также не являются обязательными, если только они не предназначены для отладки; но если вы не хотите использовать их в другом месте, кроме как в построении строк, вы также можете избавиться от них.
3. конкатенации строк, особенно в длинных циклах, также довольно трудоемки, поскольку они включают в себя множество внутренних операций копирования строк. Здесь я хотел бы использовать StringBuilder
чтобы попытаться получить некоторую производительность.
Таким образом:
using System.Text;
public void PixelValues()
{
listBox1.SuspendLayout(); // Thanks to lukeer
newBitmap = (Bitmap)pictureBox1.Image;
Color pixel;
StringBuilder sb = new StringBuilder(33); // 33 = max length of the string when all values are three digits long (quick count - could be wrong)
for (int i = 0; i < pix.Width; i++)
{
for (int j = 0; j < pix.Height; j++)
{
pixel = newBitmap.GetPixel(i, j);
sb.AppendFormat("Red: {0} - Green: {1} - Blue: {2}", pixel.R, pixel.G, pixel.B);
listBox1.Items.Add(sb.ToString());
sb.Clear();
}
}
listBox1.ResumeLayout(); // Thanks to lukeer
}
Вы также можете использовать
List<string>
вместо того чтобы добавлять элементы в
ListBox
один за другим, и добавьте всю их кучу в конце с помощью
AddRange
метод проведения
ListBox
класс, но я не уверен, что это даст значительное улучшение. Но это можно проверить, просто чтобы быть уверенным.
Надеюсь, это поможет. Любезно.
phil.o
Извините, это не мой вопрос. Каков размер фактического изображения, которое вы используете во время вашего теста, в частности?