Mengapa ambang batas gambar ini berfungsi di windows tetapi tidak di mono/linux?

Saya memiliki fungsi ambang batas yang relatif sederhana yang menggunakan kode tidak aman. Ini berfungsi dengan baik di Windows, namun, di Mono di linux, tidak ada ambang batas yang terjadi. Sulit untuk melakukan debug karena hanya ada di Linux, saya telah memeriksa bitPerPixel sudah benar beserta tinggi h, lebar w dan langkah ws semuanya juga benar.

Apa lagi yang bisa saya lakukan untuk mempersempitnya, atau adakah kesamaan di sini?

public void threshold(Bitmap bmp, int thresh)
        {
            var bitsPerPixel = Image.GetPixelFormatSize(bmp.PixelFormat) / 8;

            BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
            ImageLockMode.ReadOnly, bmp.PixelFormat);
            unsafe
            {
                byte* p = (byte*)(void*)bmData.Scan0.ToPointer();
                int h = bmp.Height;
                int w = bmp.Width;
                int ws = bmData.Stride;

                for (int i = 0; i < h; i++)
                {
                    byte* row = &p[i * ws];
                    for (int j = 0; j < w * bitsPerPixel; j += bitsPerPixel)
                    {
                        for (var k = 0; k < bitsPerPixel; k++)
                        {
                            row[j + k] = (byte)((row[j + k] > (byte)thresh) ? 255 : 0);
                        }
                    }
                }
            }
            bmp.UnlockBits(bmData);
        }

person user3791372    schedule 27.05.2017    source sumber


Jawaban (1)


Setel ImageLockMode ke ReadWrite:

BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
                                             ImageLockMode.ReadWrite, bmp.PixelFormat);

Contoh:

public unsafe void Threshold(Bitmap bmp, int thresh)
{
    var bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
    var bitsPerPixel = Image.GetPixelFormatSize(bmp.PixelFormat);
    var p = (byte*)bmData.Scan0.ToPointer();
    for (int i = 0; i < bmData.Height; ++i)
    {
        for (int j = 0; j < bmData.Width; ++j)
        {
            byte* data = p + i * bmData.Stride + j * bitsPerPixel / 8;
            data[0] = (byte)((data[0] > thresh) ? 255 : 0);
            data[1] = (byte)((data[1] > thresh) ? 255 : 0);
            data[2] = (byte)((data[2] > thresh) ? 255 : 0);
        }
    }
    bmp.UnlockBits(bmData);
person SushiHangover    schedule 27.05.2017
comment
Tampaknya GDIPlus.GdipBitmapLockBits sesuai dengan tipe ImageLockMode yang diteruskan ke Bitmap.LockBits, saya harus membandingkan sumber referensi MS dalam cara menangani tanda itu... Anda harus mengisi bug di bugzilla.xamarin.com untuk melaporkan ketidakkonsistenan. - person SushiHangover; 27.05.2017