سؤال

وأنا أحاول كتابة تطبيق يحول 48 بت لكل بكسل ملفات PNG إلى شكل الملكية (باير).

والرمز (مجاملة هنا ) يعمل أدناه كبيرة لبعض تنسيقات الملفات PNG، ولكن عندما أحاول حسن النية 48 بت بابوا نيو غينيا رمز يطرح استثناء - هناك بديل

    static public byte[] BitmapDataFromBitmap(Bitmap objBitmap)
    {
        MemoryStream ms = new MemoryStream();
        objBitmap.Save(ms, ImageFormat.BMP);  // GDI+ exception thrown for > 32 bpp
        return (ms.GetBuffer());
    }

    private void Bayer_Click(object sender, EventArgs e)
    {
        if (this.pictureName != null)
        {
            Bitmap bmp = new Bitmap(this.pictureName);
            byte[] bmp_raw = BitmapDataFromBitmap(bmp);
            int bpp = BitConverter.ToInt32(bmp_raw, 28); // 28 - BMP header defn.

            MessageBox.Show(string.Format("Bits per pixel = {0}", bpp));
        }
    }
هل كانت مفيدة؟

المحلول

وترميز BMP لا يدعم صيغ 48bpp. يمكنك الحصول على وجود صدع في بكسل مع طريقة () وBitmap.LockBits. على الرغم من أن المادة مكتبة MSDN لPixelFormat تقول أن 48bpp يعامل مثل الصور 24bpp، وأنا لا أرى في الواقع 6 بكسل بايت مع هذا الرمز:

  Bitmap bmp = new Bitmap(@"c:\temp\48bpp.png");
  BitmapData bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
    ImageLockMode.ReadOnly, PixelFormat.Format48bppRgb);
  // Party with bd.Scan0
  //...
  bmp.UnlockBits(bd);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top