Accelerare la conversione della scala di grigi bitmap, è un’opzione OpenMP in C #?

per favore aiutami a rendere questo codice parallelo usando openmp questo codice viene eseguito al clic del pulsante e la casella di testo è 128

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 IMG { public partial class Form1 : Form { public Form1() { InitializeComponent(); } string path = ""; public void openimage() { if (openFileDialog1.ShowDialog() == DialogResult.OK) { path = openFileDialog1.FileName; Graphics g = this.CreateGraphics(); g.Clear(this.BackColor); Bitmap curBitmap = new Bitmap(path); g.DrawImage(curBitmap, 200, 220, 200, 200); } } Bitmap bm; Bitmap gs; private void button1_Click(object sender, EventArgs e) { if (path == "") { openimage(); } //mack image gray scale Graphics g = this.CreateGraphics(); g.Clear(this.BackColor); // Create a Bitmap object bm = new Bitmap(path); // Draw image with no effects g.DrawImage(bm, 200, 220, 200, 200); gs = new Bitmap(bm.Width, bm.Height); for (int i = 0; i < bm.Width; i++) { for (int j = 0; j < bm.Height; j++) { Color c = bm.GetPixel(i, j); int y = (int)(0.3 * cR + 0.59 * cG + 0.11 * cB); gs.SetPixel(i, j, Color.FromArgb(y, y, y)); } } // Draw image with no effects g.DrawImage(gs, 405, 220, 200, 200); for (int i = 0; i < gs.Width; i++) { for (int j = 0; j = Convert.ToInt16(textBox19.Text)) y1 = 255; bm.SetPixel(i, j, Color.FromArgb(y1, y1, y1)); } } g.DrawImage(bm, new Rectangle(610, 220, 200, 200), 0, 0, bm.Width, bm.Height, GraphicsUnit.Pixel); // Dispose of objects gs.Dispose(); g.Dispose(); } } } 

per favore aiutami non appena riesco a credere in questo sito e in tutti i programmatori qui …

Colperai un paio di speed-bumps se OpenMP è sul tuo radar. OpenMP è una libreria multi-threading per C / C ++ non gestito, richiede il supporto del compilatore per essere efficace. Non un’opzione in C #.

Facciamo un passo indietro. Quello che hai ora è il peggiore che puoi ottenere. Get / SetPixel () è tremendamente lento. Un passo importante sarebbe quello di utilizzare Bitmap.LockBits (), che fornisce un IntPtr ai bit bitmap. È ansible festeggiare su quei bit con un puntatore a byte non sicuro. Sarà almeno un ordine di grandezza più veloce.

Facciamo un altro passo indietro, stai chiaramente scrivendo il codice per convertire un’immagine a colors in un’immagine in scala di grigi. Le trasformazioni di colore sono supportate nativamente da GDI + tramite la class ColorMatrix. Quel codice potrebbe assomigliare a questo:

 public static Image ConvertToGrayScale(Image srce) { Bitmap bmp = new Bitmap(srce.Width, srce.Height); using (Graphics gr = Graphics.FromImage(bmp)) { var matrix = new float[][] { new float[] { 0.299f, 0.299f, 0.299f, 0, 0 }, new float[] { 0.587f, 0.587f, 0.587f, 0, 0 }, new float[] { 0.114f, 0.114f, 0.114f, 0, 0 }, new float[] { 0, 0, 0, 1, 0 }, new float[] { 0, 0, 0, 0, 1 } }; var ia = new System.Drawing.Imaging.ImageAttributes(); ia.SetColorMatrix(new System.Drawing.Imaging.ColorMatrix(matrix)); var rc = new Rectangle(0, 0, srce.Width, srce.Height); gr.DrawImage(srce, rc, 0, 0, srce.Width, srce.Height, GraphicsUnit.Pixel, ia); return bmp; } } 

Credito a Bob Powell per il codice sopra.

Perché vuoi rendere questo codice parallelo? Per ottenere efficienza di elaborazione (tempo)? Se è così, penso che prima di trasformare questo codice in parallelo puoi provare un approccio diverso nel modo in cui accedi alle informazioni sui pixel nell’immagine.

Il modo in cui stai facendo questo codice è molto lento. Puoi provare a elaborare l’immagine utilizzando codice non sicuro per accedere ai pixel della class Bitmap.

Dai un’occhiata a questo thread per vedere di cosa sto parlando