c#做图p图软件(1:基本)

    技术2022-07-15  36

    1.主界面

    制作一个窗体: 这个界面可以自己做,这里不再阐述。

    2.导入图片

    我这个程序是导入文件夹,然后显示在下面的tabcontrol里。

    FolderBrowserDialog fbd = new FolderBrowserDialog(); if (fbd.ShowDialog() != DialogResult.Cancel) { ListView lv = new ListView { SmallImageList = il, LargeImageList = il, Dock = DockStyle.Fill }; DirectoryInfo di = new DirectoryInfo(fbd.SelectedPath); FileInfo[] files = di.GetFiles(); tabControl1.TabPages.Add(di.Name); tabControl1.SelectedIndex = tabControl1.TabCount - 1; tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(lv); foreach (FileInfo fi in files)//加载图像文件 { if (fi.Extension == ".jpg" || fi.Extension == ".png" || fi.Extension == ".bmp" || fi.Extension == ".ico") { Image im = Image.FromFile(fi.FullName); il.Images.Add(im); ListViewItem lvi = new ListViewItem(fi.Name, il.Images.Count - 1) { Tag = fi.FullName }; lv.Items.Add(lvi); im.Dispose(); GC.Collect(); } Application.DoEvents(); } lv.DoubleClick += Lv_DoubleClick; } fbd.Dispose(); GC.Collect();

    注意一定要把im给Dispose掉!!!我一开始没有Dispose结果加载占了3G内存!!!

    3.图片

    双击图片就可以加入:

    private void Lv_DoubleClick(object sender, EventArgs e) { PictureBox pic = new PictureBox(); Image image = Image.FromFile((string)((ListView)sender).SelectedItems[0].Tag); pic.Size = new Size(image.Width / 4, image.Height / 4); pic.SizeMode = PictureBoxSizeMode.StretchImage; pic.Image = image; pic.Location = new Point(pictures.Width / 2 - pic.Width / 2, pictures.Height / 2 - pic.Height / 2); pic.MouseMove += picBox_MouseMove; pic.MouseUp += picBox_MouseUp; pic.MouseDown += picBox_MouseDown; pic.MouseWheel += Pic_MouseWheel; pic.Tag = SetTags(pics.Count, (string)((ListView)sender).SelectedItems[0].Tag); pic.ContextMenuStrip = contextMenuStrip1; pics.Add(pic); if (pic.Left < 0) pic.Left = 0; if (pic.Top < 0) pic.Top = 0; RefreshList(); RefreshPics(); }

    因为考虑到图片要能拖动,所以添加MouseMove,MouseDown,MouseUp事件来让PictureBox能拖动。 MouseWheel事件来控制图片大小。

    //缩放 int kk = 5; if (Control.ModifierKeys == Keys.Shift)//按下Shift,快速缩放 kk = 1; PictureBox pic = (PictureBox)sender; Size size = pic.Size; double angle = Math.Atan((double)size.Height / size.Width);//计算对角线 size.Height += (int)(e.Delta * Math.Sin(angle)/kk); size.Width += (int)(e.Delta * Math.Cos(angle)/kk); if (size.Width <= 0 || size.Height <= 0) return; pic.Size = size;

    用三角函数控制缩放可以大大减小图片变形。

    按delete删除图片:直接dispose掉就行了。

    4.导出图片

    public static Bitmap SavePicture(List<PictureBox> pics,double suofang) { try { if (pics.Count == 0) return null; int h = 0, w = 0, hm = int.MaxValue, wm = int.MaxValue; foreach (PictureBox pi in pics)//定位最终图片位置 { h = (int)(Math.Max(h, pi.Top + pi.Height) / suofang); w = (int)(Math.Max(w, pi.Left + pi.Width) / suofang); hm = (int)(Math.Min(hm, pi.Top) / suofang); wm = (int)(Math.Min(wm, pi.Left) / suofang); } Bitmap bm = new Bitmap(w - wm, h - hm); Graphics g = Graphics.FromImage(bm); foreach (PictureBox p in pics) { g.DrawImage(p.Image, (int)(p.Location.X / suofang - wm), (int)(p.Location.Y / suofang - hm), (int)(p.Width / suofang), (int)(p.Height / suofang)); } GC.Collect(); return bm; } catch { MessageBox.Show("图片过大","",MessageBoxButtons.OK,MessageBoxIcon.Error); return null; } }

    唯一的问题:只支持10000x10000。。。 源码:源码下载

    Processed: 0.011, SQL: 9