Domanda

per favore mi aiuti a rendere questo codice parallelo usando OpenMP questo codice viene eseguito su 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 * c.R + 0.59 * c.G + 0.11 * c.B);
                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 < gs.Height; j++)
            {
                Color c = gs.GetPixel(i, j);
                int y1 = 0;

                if (c.R >= 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();
    }
 }
}

please help me il più presto u can i credere in questo sito e tutti i programmatori qui ...

È stato utile?

Soluzione

Ti ha colpito un paio di speed-urti se OpenMP è sul vostro radar. OpenMP è una libreria multi-threading per non gestito C / C ++, si richiede il supporto del compilatore per essere efficace. Non è un'opzione in C #.

Facciamo un passo indietro. Quello che hai ora è così male come si può eventualmente ottenere. Get / SetPixel () è terribilmente lento. Un passo importante sarebbe quello di utilizzare Bitmap.LockBits (), ti dà un'IntPtr ai bit bitmap. Si può festa in quei bit con un puntatore di byte non sicuro. Che sarà di almeno un ordine di grandezza più veloce.

Facciamo un altro passo indietro, si sono chiaramente scrivendo codice per convertire un'immagine a colori un'immagine in scala di grigi a. trasformazioni di colore sono nativamente supportati da GDI + attraverso la classe ColorMatrix. Questo 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;
  }
}

Bob Powell per il codice di cui sopra.

Altri suggerimenti

Perché vuoi fare questo codice parallelo? Per ottenere l'efficienza di elaborazione (tempo)? Se è così, penso che prima di girare questo codice parallelo si può provare un approccio diverso nel modo in cui si accede alle informazioni dei pixel nell'immagine.

Il modo in cui si sta facendo in questo codice è molto lento. Puoi provare a elaborare l'immagine utilizzando il codice non sicuro per accedere ai pixel della classe Bitmap.

Date un'occhiata a questa discussione per vedere che cosa sto parlando

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top