Przekazanie bitmapy ze zdjęciem do biblioteki DLL napisanej w C++

0

Witam potrzebuje pomocy.Tworze aplikacje w C# ,która po wybraniu zdjęć z dysku oraz po wykonaniu pętli wybiera interesujące zdjęcie i chciałbym z C# wysłać to zdjęcie do C++ dll. i w nim wykonać jakieś operacje ,np.zdjęcie w odcieniu szarości oraz zwrócenie z powrotem tego do c#.Proszę o nie mówienie ,że są lepsze sposoby bo taki mam temat pracy magisterskiej.

C# code :

  for (int i = 0; i <= 30; i++)
            {
                if (images[n-1]== images[i])//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                {
                    Bitmap bmp = new Bitmap(images[i]);
                    int width = bmp.Width;//320
                    int height = bmp.Height;//239                    
                    var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
                    var bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
                    int results = NativeMethods.Gray(bmpData.Width, bmpData.Height, bmpData.Scan0, bmpData.Stride);
                    bmp.UnlockBits(bmpData);
                    image2.Image = bmp;
                }
            }
       
        }
        public static class NativeMethods
        {
            [DllImport("number.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_Z9AddNumberii")]
            public static extern int Gray(int width, int height, IntPtr scan0, int stride);
        }

C++ dll code :

int Gray(int width, int height, unsigned char *scan0, int stride)
{
	
	for (int x = 0; x < width; x++)
	{
		for (int y = 0; y < height; y++)
		{
			
			
		}
	}
}

Macie może jakieś pomysły jak wypełnić kod C++ dll oraz powiedzieć czy taki sposób w ogóle jest dobry?

1

Dla RGB/BGR jakoś tak będzie:

int Gray(int width, int height, unsigned char *scan0, int stride)
{
	for (int y = 0; y < height; ++y)
	{
		for (int x = 0, offset = 0; x < width; ++x, offset += 3)
		{
			scan0[offset + 0] = /* ... */; // R lub B 
			scan0[offset + 1] = /* ... */; // G 
			scan0[offset + 2] = /* ... */; // B lub R
		}

		scan0 += stride;
	}
}
0

A ja się zastanawiam po co te kombinacje?
Czy ty naprawdę chcesz zmienić obrazek na skalę szarości (tak sugeruje nazwa funkcji)?
Jeśli tak, to po co ci przeskok do C++?
Jeśli nie, to brakuje kontekstu, co się ma dziać po stronie C++ i czemu właściwie potrzebujesz C++.
Zależnie od okoliczności można podjąć różna działania (np posłużyć się C++ CLI i używać bitmapę bezpośrednio).

0

Przeczytaj jeszcze raz to co napisalem w poscie na samej gorze a bedziesz wiedzial dlaczego potrzebuje C++ i C#

0
/* ... */; // R lub B 

Jak dokladnie odwolac sie w miejscu komentarza dla np.powiedzmy kanalu R ?

0

Wyliczasz skalę szarości ze wzoru 0.21 R + 0.72 G + 0.07 B i przypisujesz otrzymaną wartość do wszystkich kanałów RGB

0

no to rozumiem ale moglbys to wsadzic do kodu jak to przykladowo mialoby wygladac?

0

No nie żartuj. Praktycznie dostałeś gotowy kod, wysil się trochę.

0

Znaczy nie wiem czy dobrze rozumiem o co chodzi :

scan0[offset + 0] =0.21 R ;
scan0[offset + 1] = 0.72 G;
scan0[offset + 2] =   0.07 B;

Cos takiego ?
Tylko co mam wsadzic w miejsce R,G i B bo symulator mi tego nie ogarnie ???

0

A ok juz kumam o co chodzi ,dzieki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1