Pregunta

por favor me ayude a hacer de este código paralelo usando OpenMP este código se ejecuta en el botón de clic y el cuadro de texto es de 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();
    }
 }
}

por favor me ayuda tan pronto como u puedo creer en este sitio y todos los programadores aquí ...

¿Fue útil?

Solución

Te encuentras con un par de velocidad de gallina si es OpenMP en su radar. OpenMP es una biblioteca multi-threading para C no administrado / C ++, se requiere el apoyo del compilador para ser eficaz. No es una opción en C #.

Vamos a dar un paso atrás. Lo que tenemos ahora es tan malo como usted puede conseguir posiblemente. Obtener / SetPixel () es terriblemente lento. Un paso importante sería el uso de Bitmap.LockBits (), que le da una IntPtr a los bits de mapa de bits. Puede partido de esos bits con un puntero de bytes inseguro. Que habrá al menos un orden de magnitud más rápido.

Vamos a dar otro paso hacia atrás, que está escribiendo con claridad código para convertir una imagen en color de una imagen de escala de grises a. transformaciones de color son compatibles de forma nativa por GDI + a través de la clase ColorMatrix. Ese código podría tener este aspecto:

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 para el código de seguridad.

Otros consejos

¿Por qué quiere hacer de este código paralelo? Para ganar eficiencia de procesamiento (tiempo)? Si es así, creo que antes de encender el código en paralelo se puede intentar un enfoque diferente en la forma en que está accediendo a la información de los píxeles de la imagen.

La forma en que está haciendo en este código es muy lento. Usted puede tratar de procesar la imagen con código no seguro para acceder a los píxeles de la clase Bitmap.

Tome una mirada en este hilo para ver lo que estoy hablando

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top