C#32位bmp转透明底png

C#32位bmp转透明底png

说明

将bmp以编码形式读出来,得到每个像素的argb值,赋值给png图像。
仅支持位深度为32位的bmp图像。
另外代码部分还包括文件拖拽和根据窗口大小动态改变控件大小和位置的方法。

效果图

转换样例

程序界面

代码

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace bmptopng
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ImageList imgList = new ImageList
            {
                ImageSize = new Size(1, 25)
            };
            listView1.SmallImageList = imgList;
            listView1.View = View.Details;
            listView1.Columns.Add("序号", 80, HorizontalAlignment.Right);
            listView1.Columns.Add("文件路径", 478, HorizontalAlignment.Left);
            listView1.CheckBoxes = false;
            listView1.FullRowSelect = true;
            listView1.Width = 558;
            listView1.Height = 300;
            listView1.Location = new Point(12, 12);

            button1.Location = new Point(12, 318);
            button2.Location = new Point(93, 318);
            button3.Location = new Point(174, 318);
            button4.Location = new Point(495, 318);
        }

        private void listView1_DragDrop(object sender, DragEventArgs e)
        {
            string[] fileNames = (string[])e.Data.GetData(DataFormats.FileDrop);
            listView1.BeginUpdate();
            for (int i = 0; i < fileNames.Length; i++)
            {
                if (fileNames[i].EndsWith(".bmp"))
                {
                    ListViewItem lvi = new ListViewItem();
                    lvi.Text = (listView1.Items.Count + 1).ToString();
                    lvi.SubItems.Add(fileNames[i]);
                    listView1.Items.Add(lvi);
                }
            }
            listView1.EndUpdate();
        }

        private void listView1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.All;
            else e.Effect = DragDropEffects.None;
        }

        int i = 0;
        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);
            listView1.Width = Size.Width - 42;
            listView1.Height = Size.Height - 100;
            if (i != 0) listView1.Columns[1].Width = listView1.Width - listView1.Columns[0].Width;
            else i = 1;
            button1.Location = new Point(button1.Location.X, Size.Height - 82);
            button2.Location = new Point(button2.Location.X, Size.Height - 82);
            button3.Location = new Point(button3.Location.X, Size.Height - 82);
            button4.Location = new Point(Size.Width - 105, Size.Height - 82);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog
            {
                Multiselect = true,
                Title = "选择图像",
                Filter = "bmp文件(*.bmp)|*.bmp"
            };
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                listView1.BeginUpdate();
                foreach (string file in dialog.FileNames)
                {
                    ListViewItem lvi = new ListViewItem();
                    lvi.Text = (listView1.Items.Count + 1).ToString();
                    lvi.SubItems.Add(file);
                    listView1.Items.Add(lvi);
                }
                listView1.EndUpdate();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < listView1.Items.Count; i++)
            {
                if (listView1.Items[i].Selected == true)
                {
                    listView1.Items.RemoveAt(i);
                    i--;
                }
            }
            for (int i = 0; i < listView1.Items.Count; i++)
            {
                listView1.Items[i].Text = (i + 1).ToString();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            listView1.Items.Clear();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            for (int lic = 0; lic < listView1.Items.Count; lic++)
            {
                string fileName = listView1.Items[lic].SubItems[1].Text;
                FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                byte[] buffer = new byte[fileStream.Length];
                fileStream.Read(buffer, 0, buffer.Length);
                fileStream.Close();
                int bitmapWidth = ((Convert.ToInt32(buffer[21]) * 16 + Convert.ToInt32(buffer[20])) * 16 + Convert.ToInt32(buffer[19])) * 16 + Convert.ToInt32(buffer[18]);
                int bitmapHeigth = ((Convert.ToInt32(buffer[25]) * 16 + Convert.ToInt32(buffer[24])) * 16 + Convert.ToInt32(buffer[23])) * 16 + Convert.ToInt32(buffer[22]);
                Bitmap bitmap = new Bitmap(bitmapWidth, bitmapHeigth);
                for (int x = 0; x < bitmapWidth; x++)
                {
                    for (int y = 0; y < bitmapHeigth; y++)
                    {
                        Color color;
                        if (y * bitmapWidth + x + 57 <= buffer.Length - 1) color = Color.FromArgb(Convert.ToInt32(buffer[(y * bitmapWidth + x) * 4 + 57]), Convert.ToInt32(buffer[(y * bitmapWidth + x) * 4 + 56]), Convert.ToInt32(buffer[(y * bitmapWidth + x) * 4 + 55]), Convert.ToInt32(buffer[(y * bitmapWidth + x) * 4 + 54]));
                        else color = Color.FromArgb(0, 0, 0, 0);
                        bitmap.SetPixel(x, bitmapHeigth - y - 1, color);
                    }
                }
                bitmap.Save(fileName.Substring(0, fileName.Length - 3) + "png");
            }
        }
    }
}