powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обработка изображений на С#
6 сообщений из 6, страница 1 из 1
Обработка изображений на С#
    #38538577
VIP2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть задачки:

авторНапишите программу, которая обрабатывает картинки в задаваемой директории. Каждая картинка преобразовывается по одному из следующих правил:

Убирается одна из компонент (например красная)


Вот, что у меня получилось (я хочу распараллелить цикл по файлам.):

автор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;
using System.Threading;
using System.Diagnostics;
using System.Threading.Tasks;

namespace Задание_1
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}

private void MainForm_Shown(object sender, EventArgs e)
{
pictureBox1.Load("d:\\img\\1.bmp");
pictureBox2.Load("d:\\img\\2.bmp");
pictureBox3.Load("d:\\img\\3.bmp");
pictureBox4.Load("d:\\img\\4.bmp");
}

private void button1_Click(object sender, EventArgs e)
{
Red();
}

private void Red()
{
// Создаем bitmap

string[] fileNames = System.IO.Directory.GetFiles("d:\\img");

Stopwatch sw = new Stopwatch();
sw.Start();
Parallel.For(0, fileNames.Length, t =>
{

Bitmap bmp = new Bitmap(fileNames[t]);

Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
System.Drawing.Imaging.BitmapData bmpData =
bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
bmp.PixelFormat);
IntPtr ptr = bmpData.Scan0;

// Создаем массив
int bytesLine = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] byteMassive = new byte[bytesLine];
System.Runtime.InteropServices.Marshal.Copy(ptr, byteMassive, 0, bytesLine);

for (int j = 0; j < bmp.Height; j++)
for (int i = 0; i < bmp.Width; i++)
{
Color pixelColor = bmp.GetPixel(i, j);
Color newColor = Color.FromArgb(pixelColor.R, 0, pixelColor.B);
bmp.SetPixel(i, j, newColor);
}

System.Runtime.InteropServices.Marshal.Copy(byteMassive, 0, ptr, bytesLine);
// Unlock the bits.
bmp.UnlockBits(bmpData);

if (t == 0) pictureBox1.Image = bmp;
if (t == 1) pictureBox2.Image = bmp;
if (t == 2) pictureBox3.Image = bmp;
if (t == 3) pictureBox4.Image = bmp;

});

sw.Stop();
MessageBox.Show(sw.Elapsed.ToString());

}
}
}


Программа выдает ошибку: Область растрового изображения уже заблокирована.
Для одной картинки у меня получилось сделать :

автор {
Bitmap image1 = new Bitmap(pictureBox1.Image);

for (int j = 0; j < pictureBox1.Image.Height; j++)
for (int i = 0; i < pictureBox1.Image.Width; i++)
{
Color pixelColor = image1.GetPixel(i, j);
Color newColor = Color.FromArgb(0, pixelColor.G, pixelColor.B);
image1.SetPixel(i, j, newColor);
}

pictureBox1.Image = image1;


Как сделать, чтобы программа работала корректно?
...
Рейтинг: 0 / 0
Обработка изображений на С#
    #38539033
VIP2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никто не сможет помочь?
...
Рейтинг: 0 / 0
Обработка изображений на С#
    #38539117
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIP2020,

1)Не смешивай работу с LockBits и GetPixel
GetPixel внутри себя делает LockBits
если будешь использовать LockBits - косяки с форматом и размером исправить нужно будет


2)для обработки изображений их незачем рисовать на экране
...
Рейтинг: 0 / 0
Обработка изображений на С#
    #38539132
VIP2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, да я это знаю. Но у меня не получается сделать работоспособную программу.
...
Рейтинг: 0 / 0
Обработка изображений на С#
    #38539146
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIP2020,

1) загружай изображение не в визуальный PictureBox, а просто в Bitmap, потом рисовать будешь
2) выбрось LockBits
3) работай одновременно с одним изображением
--------------------------------
когда заработает это - двигайся дальше
...
Рейтинг: 0 / 0
Обработка изображений на С#
    #38540422
mrigrek74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIP2020,

Смотри этот пример. И замени
свой цикл for на
Код: c#
1.
2.
for (int counter = 2; counter < byteMassive.Length; counter += 3)
                    byteMassive[counter] = 0;


Правда, там картинки в jpeg, а не bmp.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обработка изображений на С#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]