コード例 #1
0
ファイル: ImageALP.cs プロジェクト: zxc120/GARbro
        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));
        }
コード例 #2
0
        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));
        }
コード例 #3
0
ファイル: ImageALP.cs プロジェクト: y111303tut/GARbro
        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));
        }
コード例 #4
0
ファイル: BmpExtension.cs プロジェクト: zxc120/GARbro
        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));
        }
コード例 #5
0
        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();
        }
コード例 #6
0
ファイル: BmpMetaData.cs プロジェクト: vbegin/ImageSharp
 /// <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;
 }
コード例 #7
0
ファイル: BmpMetaData.cs プロジェクト: wurzziyoon/ImageSharp
 /// <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;