Bitmapa zdjęć oraz sprawdzenie wartości każdego piksela.

0

Załóżmy sytuacje ,że mam bitmape z wybranym zdjęciem i potrzebuje ją przesłać do C++ żeby pobrało wartosci pikseli ,ustawiło je w odcieniach szarości i wyrzuciło z powrotem do C#.Ma ktoś pomysł jak napisać taką prostą funkcje?

#include <iostream>
#include <windows.h>
#include <cmath>
int konwszar(int width,int height,HBITMAP bitmap)
{
    int tab[width][height];
    for (int x = 0; x < width; x++)
    {
    for (int y = 0; y < height; y++)
    {
        tab[width][height]=GetPixel(x,y);
        int a = tab[width][height].A;
        int r = tab[width][height].R;
        int g = tab[width][height].G;
        int b = tab[width][height].B;
        int avg = (r + g + b) / 3;
        bitmap.SetPixel(x, y, Color.FromArgb(a, avg, avg, avg));
    }
    }
    return bitmap;
}

Napisałem taki programik ,sypie błędami ,ale chciałem rzucić cień jak to ma wyglądać.Proszę o jakieś sugestie .

1
  1. bitmapa z C# to nie jest HBITMAP.

  2. int avg = (r + g + b) / 3 to nie jest prawidłowy sposób wyliczania odcienia szarości.
    Dokładne wartości współczynników są przedmiotem debaty, ale zacząłbym od klasycznych, czyli r × 0.299, g × 0.587, b × 0.114
    Poczytaj tu.

  3. Nie wyjaśniasz w jaki sposób ma się odbywać „przesyłanie” z C# do C++ i z powrotem. Przez wywołanie kodu C# w programie C++? Odwrotnie? Przez komunikację międzyprocesową albo sieciową? O co właściwie chodzi?

  4. Dlaczego nie napiszesz całości po prostu w C# - jeśli problemem jest wydajność to są sposoby na poprawienie jej w C#.

  5. Metoda z dwoma forami i GetPixel/PutPixel będzie powolna niezależnie od języka. Dobrą wydajność osiągnie się dzięki użyciu wskaźników. Jeśli wydajność jest krytyczna to można kombinować dalej.

Ale najpierw uściślij co masz właściwie na myśli mówiąc o „przesyłaniu” i czy faktycznie tego potrzebujesz.

0

Importuje z c# za pomocą p/invoke czyli Dllimport ,co do musienia zrobienia tego w dwoch jezykach ,tak muszę bo tak zostało mi to narzucone.W c# wrzucam bitmape ze zdjeciem wysokosc i szerokosc , i ma zostac odebrane jako parametr w c++ dll .Ogólnie mój problem polega na tym ,że potrzebuje ,,odebrać'' bitmape ze zdjęciem w c++ dll. W c# po wybraniu plików z dysku i przefiltrowaniu odpowiedniego którego chce : Bitmap bmp = new Bitmap(images[i]); wysyłam ta zmienna za pomoca dllImport i jak to odebrać jako parametr w funkcji ? Ma ktoś jakiś pomysł?

0

@Cinexus123:

A gdyby zrobić tak, że

C# zapisuje plik na dysku i odpala program w cpp ze ścieżka do tej bitmapy jako argument, a ten cpp zapisuje output na dysku?

w cmd:

program.exe "C:\images\image.bmp"

https://stackoverflow.com/questions/4291912/process-start-how-to-get-the-output

0

Niestety musi to wrócić do c# ,sorry ale taki temat pracy magisterskiej :)

0
// pseudokod w C#
[DllImport(blah)]
public static extern void konwszar(int width, int height, IntPtr scan0, int stride);
...
Bitmap bmp;
...
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
konwszar(bmpData.Width, bmpData.Height, bmpData.Scan0, bmpData.Stride);
bmp.UnlockBits(bmpData);
// pseudokod w C++
void konwszar(int width, int height, unsigned char *scan0, int stride)
{
    // scan0 to wskaźnik na dane (zerową linię obrazka)
    // stride to odstęp między liniami bitmapy w bajtach
    // width i height wiadomo
    // stride jest potrzebne bo na końcu każdej linii mogą występować dodatkowe bajty wyrównujące.

    // czyli zaczynamy od scanline=scan0, obrabiamy wiersz, a następny zaczyna się od bajtu scanline=scan0+stride.
    // stride może być liczbą ujemną.
}
0

Szczerze powiem ,że nie wiem jak to osadzić w moim kodzie a niestety nie mogę go tutaj wrzucić bo potem osądzą mnie o piractwo przy oddawaniu magisterki :) C# myśle ,że ogarniam natomiast nie wiem jak wypełnić c++,idą dwa fory po width i height i nie wiem jak w środku wypełnic.

Może być coś takiego ???

Mat frame(Size(width, height), CV_8UC4, imageBuffer, Mat::AUTO_STEP);
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);

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