|
Обработка изображений на С#
|
|||
---|---|---|---|
#18+
Суть задачки: авторНапишите программу, которая обрабатывает картинки в задаваемой директории. Каждая картинка преобразовывается по одному из следующих правил: Убирается одна из компонент (например красная) Вот, что у меня получилось (я хочу распараллелить цикл по файлам.): автор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; Как сделать, чтобы программа работала корректно? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2014, 03:51 |
|
Обработка изображений на С#
|
|||
---|---|---|---|
#18+
Никто не сможет помочь? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2014, 14:31 |
|
Обработка изображений на С#
|
|||
---|---|---|---|
#18+
VIP2020, 1)Не смешивай работу с LockBits и GetPixel GetPixel внутри себя делает LockBits если будешь использовать LockBits - косяки с форматом и размером исправить нужно будет 2)для обработки изображений их незачем рисовать на экране ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2014, 15:10 |
|
Обработка изображений на С#
|
|||
---|---|---|---|
#18+
Изопропил, да я это знаю. Но у меня не получается сделать работоспособную программу. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2014, 15:15 |
|
Обработка изображений на С#
|
|||
---|---|---|---|
#18+
VIP2020, 1) загружай изображение не в визуальный PictureBox, а просто в Bitmap, потом рисовать будешь 2) выбрось LockBits 3) работай одновременно с одним изображением -------------------------------- когда заработает это - двигайся дальше ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2014, 15:25 |
|
Обработка изображений на С#
|
|||
---|---|---|---|
#18+
VIP2020, Смотри этот пример. И замени свой цикл for на Код: c# 1. 2.
Правда, там картинки в jpeg, а не bmp. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2014, 13:28 |
|
|
start [/forum/topic.php?fid=20&msg=38539033&tid=1403354]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 138ms |
0 / 0 |