1

I'm trying to create a Bitmap in c# app layer, filling it on C++ layer with OpenCV, and displaying it back in c#.

This leads to visualization issues. I wrote a simplified code which demonstrates the problem.

Results

enter image description here

My code

C# app:

int width = 640, height = 480;
Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.ReadWrite,
     System.Drawing.Imaging.PixelFormat.Format8bppIndexed);

CppWrapper.fillImage((byte*)bmpData.Scan0.ToPointer(), width, height, bmpData.Stride);
bitmap.Save("filledBitmap.bmp", ImageFormat.Bmp);

C# wrapper:

[DllImport("CppWrapperLib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static unsafe extern void fillImage(byte* im, int width, int height, int stride);

C++ Layer:

void __stdcall fillImage(byte* im, int width, int height, int stride)
{
    cv::Mat mat(cv::Size(width, height), CV_8UC1, im, stride);

    mat.setTo(0);
    cv::circle(mat, cv::Point(width / 2, height / 2), 50, 255,-1);
    cv::circle(mat, cv::Point(width / 2, height / 2), 40, 180, -1);
    cv::circle(mat, cv::Point(width / 2, height / 2), 30, 150, -1);
    cv::circle(mat, cv::Point(width / 2, height / 2), 20, 120, -1);
    cv::circle(mat, cv::Point(width / 2, height / 2), 10, 80, -1);
}

Thanks!

1 Answer 1

1

update: I couldn't find any default palette which corresponds with your numbers, since I don't have time at this moment to generate an image myself, I'll post an update with the default palette numbering later. Nevertheless, you seem to be facing a palette issue.

It looks like you are using a 8-bit gray-scale.

In that case you'll need to override the default palette.

//C# part 
ColorPalette palette = bitmap.Palette;
for (int c = 0; c <= 255; c++)
    palette .Entries[c] = Color.FromArgb(255, c, c, c);

bitmap.Palette = palette;

note Since you are saving the bitmap I am not sure if the palette is saved with the bitmap by default.

By default the 8-bit palette is set to the old VGA colorspace:

enter image description here

Some difference between MAC and windows:

http://www.columbia.edu/itc/visualarts/r4110/f2000/week06/06_03_Color_palettes.pdf

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.