Пиксельные части изображения в C#
Эта программа позволяет щелкнуть и перетащить, чтобы выбрать область и пикселировать область.
Код, который позволяет вам выбрать область, интересен, но достаточно прост. См. Код и пример Используйте поле резиновой ленты, чтобы пользователь мог выбрать область на снимке в C# для получения дополнительной информации о выборе областей. Код, который загружает и сохраняет изображения, также прост.
В следующем коде показана наиболее интересная часть программы: метод, который пикселирует область изображения.
// Пикселируйте указанный прямоугольник.
private void PixellateRectangle(Rectangle rect)
{
// Ограничьте прямоугольник, чтобы он поместился на изображении.
int bm_wid = CurrentBitmap.Width;
int bm_hgt = CurrentBitmap.Height;
rect = Rectangle.Intersect(rect,
new Rectangle(0, 0, bm_wid, bm_hgt));
// Обработать прямоугольник.
const int box_wid = 8;
using (Graphics gr =
Graphics.FromImage(CurrentBitmap))
{
int start_y = box_wid * (int)(rect.Top / box_wid);
int start_x = box_wid * (int)(rect.Left / box_wid);
for (int y = start_y; y <= rect.Bottom; y += box_wid)
{
for (int x = start_x; x <= rect.Right; x += box_wid)
{
// Область пикселя в верхнем левом углу (x, y).
// Получаем средние значения цветов пикселей.
int total_r = 0, total_g = 0,
total_b = 0, num_pixels = 0;
for (int dy = 0; dy < box_wid; dy++)
{
if (y + dy >= bm_hgt) break;
for (int dx = 0; dx < box_wid; dx++)
{
if (x + dx >= bm_wid) break;
Color pixel_color =
CurrentBitmap.GetPixel(x + dx, y + dy);
total_r += pixel_color.R;
total_g += pixel_color.G;
total_b += pixel_color.B;
num_pixels++;
}
}
byte r = (byte)(total_r / num_pixels);
byte g = (byte)(total_g / num_pixels);
byte b = (byte)(total_b / num_pixels);
Color new_color = Color.FromArgb(255, r, g, b);
// Дайте всем пикселам в поле этот цвет.
using (Brush br = new SolidBrush(new_color))
{
gr.FillRectangle(br, x, y, box_wid, box_wid);
}
}
}
/ picImage.Image = CurrentBitmap;
picImage.Refresh();
}
}
Этот метод сначала пересекает выбранный прямоугольник с границами изображения. Если пользователь перетаскивает и затем отбрасывает мышь с края изображения, прямоугольник будет содержать точки от изображения, и нет смысла пытаться их обработать.
Далее код устанавливает константу box_wid в 8. Это размер пиксельных ячеек. Вы можете изменить это значение, чтобы сделать поля больше или меньше.
Переменная уровня CurrentBitmap содержит текущее изображение. Это исходное изображение, загруженное из файла с некоторыми областями, возможно, уже пиксельными. Программа создает объект Graphics, связанный с этим изображением, для рисования на нем.
Далее программа вычисляет координаты X и Y в изображении, где она начнет пикетирование. Он делит координаты целевого прямоугольника на box_wid, использует (int) для усечения результата, а затем умножает его на box_wid. Это делает стартовые X и Y координаты наибольшего кратного box_wid меньше или равного верхнему левому углу целевого прямоугольника. Код делает это, поэтому пиксели разных прямоугольников будут красиво выстраиваться. Если вы нажмете и перетащите на пиксель две области на изображении, и эти области перекрываются, их пиксельные ячейки будут выстраиваться в линию.
Затем код перебирает пиксели в целевом прямоугольнике. Для каждой области box_wid & times; box_wid код объединяет все цветовые компоненты пикселей и делит на количество пикселей внутри поля, чтобы получить среднее значение цвета. Затем код заполняет поле средним цветом.
