// 用于保存执行了所有操作的图片
        public void SavePhoto()
        {
            Bitmap image    = null;
            Bitmap orgImage = null;

            try
            {
                // 读入原始图片及其原始格式
                Cursor.Current = Cursors.WaitCursor;
                Global.Progress.Update(this, "Processing photo", 1, 2);
                // 确保图片不是只读的
                if (FileManager.IsFileReadOnly(Photo.PhotoPath))
                {
                    throw new ApplicationException(string.Format("The photo \'{0}\' is read-only.", _photo.PhotoPath));
                }
                // 创建可被保存的图片(原始图片的拷贝),保存原始图片知道我们将操作执行于新图片之上
                // 然后使用原始图片来拷贝exif信息
                orgImage = new Bitmap(_photo.PhotoPath);
                // 需要拷贝以便覆写原始图片
                image = new Bitmap(orgImage);
                // 存储此图片的格式,用于后面的保存
                ImageFormat format = orgImage.RawFormat;
                Global.Progress.Complete(this);
                Cursor.Current = Cursors.Default;
                // 在图片上执行所有的操作
                OptimizeActions optimize = new OptimizeActions();
                optimize.Apply(ref image, 0.0F);
                // 在保存前拷贝exif信息
                if (Global.Settings.GetBool(SettingKey.MaintainExifInfo))
                {
                    Exif.Copy(orgImage, image);
                }
                // 在覆写前需要关闭原始图片
                orgImage.Dispose();
                orgImage = null;
                // 将图片存回文件系统
                Global.Progress.Update(this, "Saving photo", 2, 2);
                image.Save(_photo.PhotoPath, format);
                OnNewPhoto(_photo.PhotoPath, image, format);
            }
            catch (Exception ex)
            {
                Global.DisplayError(string.Format("The file \'{0}\' could not be saved.", _photo.PhotoName), ex);
            }
            finally
            {
                // 消除操作
                if (!(orgImage == null))
                {
                    orgImage.Dispose();
                }
                if (!(image == null))
                {
                    image.Dispose();
                }
            }
            //  the crop area should be cleared
            Global.Progress.Complete(this);
            Cursor.Current = Cursors.Default;
        }
Пример #2
0
        // 在列表中选中的缩略图上执行参数中指定的旋转操作
        private void RotateThumbnails(ActionItem actionItem)
        {
            Bitmap image    = null;
            Bitmap orgImage = null;

            try
            {
                int pos = 1;
                // 要显示的状态栏信息
                string message = string.Format("Processing photo{0}", ((listView.SelectedItems.Count == 1) ? "" : "s"));
                // 将指定的操作实施到选定的图片上
                foreach (ListViewItem item in listView.SelectedItems)
                {
                    Global.Progress.Update(this, message, pos, listView.SelectedItems.Count);
                    pos++;
                    // 确定如何旋转图片
                    RotateFlipType flipType = RotateFlipType.RotateNoneFlipNone;
                    switch (actionItem.Action)
                    {
                    case PhotoAction.RotateLeft:
                        flipType = RotateFlipType.Rotate270FlipNone;
                        break;

                    case PhotoAction.RotateRight:
                        flipType = RotateFlipType.Rotate90FlipNone;
                        break;

                    case PhotoAction.FlipHorizontal:
                        flipType = RotateFlipType.RotateNoneFlipX;
                        break;

                    case PhotoAction.FlipVertical:
                        flipType = RotateFlipType.RotateNoneFlipY;
                        break;
                    }
                    // 获取图片对象
                    Photo photo = (Photo)item.Tag;
                    //// 确保图片不处于只读模式
                    //if (FileManager.IsFileReadOnly(photo.PhotoPath))
                    //{
                    //    throw new ApplicationException(string.Format("The photo \'{0}\' is read-only.", photo.PhotoPath));
                    //}

                    // 创建两个图片对象,image用于在图片上执行操作并保存
                    // orgImage用作原始图片的副本,用于在对image执行操作后其拷贝exif信息
                    orgImage = new Bitmap(photo.Thumbnail, photo.Thumbnail.Width, photo.Thumbnail.Height);
                    // 需要做一个拷贝以便覆写源图片
                    image = new Bitmap(orgImage);
                    // 保留图片的格式信息,用于后面的保存操作
                    ImageFormat format = orgImage.RawFormat;
                    // 旋转图片
                    image.RotateFlip(flipType);
                    // 在保存前拷贝exif信息
                    if (Global.Settings.GetBool(SettingKey.MaintainExifInfo))
                    {
                        Exif.Copy(orgImage, image);
                    }
                    // 需要在覆写前关闭原始图片
                    orgImage.Dispose();
                    orgImage = null;
                    //保存图片
                    //image.Save(photo.PhotoPath, format);
                    photo.Thumbnail = image;
                    image.Dispose();
                    image = null;
                }
            }
            catch
            {
                // 执行清除操作
                if (!(orgImage == null))
                {
                    orgImage.Dispose();
                }
                if (!(image == null))
                {
                    image.Dispose();
                }
                //Global.DisplayError("The photo could not be rotated.", ex);
            }
        }