كيف يمكنني عرض "الخام" بيانات الصورة PNG
سؤال
وأنا أحاول كتابة تطبيق يحول 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);
لا تنتمي إلى StackOverflow