public ImageData ReadBmp(IBinaryStream file, BmpMetaData info, byte[] alpha, int alp_stride) { var decoder = new BmpBitmapDecoder(file.AsStream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); BitmapSource bitmap = decoder.Frames[0]; bitmap = new FormatConvertedBitmap(bitmap, PixelFormats.Bgr32, null, 0); int dst_stride = (int)info.Width * 4; var pixels = new byte[(int)info.Height * dst_stride]; bitmap.CopyPixels(pixels, dst_stride, 0); int dst = 0; int src = 0; for (int y = (int)info.Height; y > 0; --y) { int a_src = src; for (int x = 3; x < dst_stride; x += 4) { pixels[dst + x] = alpha[a_src++]; } dst += dst_stride; src += alp_stride; } return(ImageData.Create(info, PixelFormats.Bgra32, null, pixels, dst_stride)); }
public void CloneIsDeep() { var meta = new BmpMetaData() { BitsPerPixel = BmpBitsPerPixel.Pixel24 }; var clone = (BmpMetaData)meta.DeepClone(); clone.BitsPerPixel = BmpBitsPerPixel.Pixel32; Assert.False(meta.BitsPerPixel.Equals(clone.BitsPerPixel)); }
public ImageData Read(IBinaryStream file, BmpMetaData info) { if (info.BPP != 24 && info.BPP != 32 || !file.CanSeek) { return(null); } var alp_name = Path.ChangeExtension(info.FileName, "alp"); if (alp_name.Equals(info.FileName, StringComparison.InvariantCultureIgnoreCase) || !VFS.FileExists(alp_name)) { return(null); } var alpha_size = info.Width * info.Height; var alpha = new byte[alpha_size]; using (var alp = VFS.OpenStream(alp_name)) { if (alpha.Length != alp.Read(alpha, 0, alpha.Length) || alp.ReadByte() != -1) { return(null); } } file.Position = info.HeaderLength; int dst_stride = (int)info.Width * 4; int gap = -((int)info.Width * info.BPP / 8) & 3; var pixels = new byte[(int)info.Height * dst_stride]; int src_pixel_size = info.BPP / 8; int dst = (int)(info.Height - 1) * dst_stride; for (int y = (int)info.Height - 1; y >= 0; --y) { int a_src = (int)info.Width * y; for (int x = 0; x < dst_stride; x += 4) { file.Read(pixels, dst + x, src_pixel_size); pixels[dst + x + 3] = alpha[a_src++]; } if (gap != 0) { file.Seek(gap, SeekOrigin.Current); } dst -= dst_stride; } return(ImageData.Create(info, PixelFormats.Bgra32, null, pixels, dst_stride)); }
public ImageData Read(IBinaryStream file, BmpMetaData info) { if (info.BPP != 0x10 || !file.CanSeek) { return(null); } int stride = ((int)info.Width * 3 + 3) & ~3; int total_24bpp = stride * (int)info.Height; if (total_24bpp + info.ImageOffset != file.Length) { return(null); } file.Position = info.ImageOffset; var pixels = file.ReadBytes((int)total_24bpp); return(ImageData.CreateFlipped(info, PixelFormats.Bgr24, null, pixels, stride)); }
public override void WriteImage(Image image) { BinaryWriter writer = new BinaryWriter(new FileStream(OutputPath + ".bmp", FileMode.Create)); BmpMetaData metaData = new BmpMetaData(image); writer.Write(BmpMetaData.bitmapSignatureBytes); writer.Write(metaData.sizeOfBitmapFile); writer.Write(BmpMetaData.reservedBytes); writer.Write(BmpMetaData.pixelDataOffset); writer.Write(BmpMetaData.sizeOfThisHeader); writer.Write(metaData.height); writer.Write(metaData.width); writer.Write(BmpMetaData.numberOfColorPlanes); writer.Write(BmpMetaData.colorDepth); writer.Write(BmpMetaData.compressionMethod); writer.Write(BmpMetaData.rawBitmapDataSize); writer.Write(BmpMetaData.horizontalResolution); writer.Write(BmpMetaData.verticalResolution); writer.Write(BmpMetaData.colorTableEntries); writer.Write(BmpMetaData.importantColors); for (int i = 0; i < image.Height; i++) { var rowOfPixels = image.ImagePalette.ListOfPixels.GetRange(i * image.Width, image.Width); foreach (var pixel in rowOfPixels) { writer.Write(pixel.Color.B); writer.Write(pixel.Color.G); writer.Write(pixel.Color.R); } } writer.Write(new byte[] { 0, 0 }); writer.Flush(); writer.Close(); }
/// <summary> /// Initializes a new instance of the <see cref="BmpMetaData"/> class. /// </summary> /// <param name="other">The metadata to create an instance from.</param> private BmpMetaData(BmpMetaData other) { this.BitsPerPixel = other.BitsPerPixel; this.InfoHeaderType = other.InfoHeaderType; }
/// <summary> /// Initializes a new instance of the <see cref="BmpMetaData"/> class. /// </summary> /// <param name="other">The metadata to create an instance from.</param> private BmpMetaData(BmpMetaData other) => this.BitsPerPixel = other.BitsPerPixel;