none
C#旋转图像并保存 RRS feed

  • 问题

  • 我在界面上对图像进行旋转后,怎样在硬盘里也对相应图像进行旋转操作,就像windows 照片查看器那样,旋转后自动保存了。  望各位指教,非常感谢。。。。


    程序人生

    2013年5月27日 6:59

答案

全部回复

  • 具体实现代码可以看看下面的帖子:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/a1e62e03-d732-444d-bb3d-6e7907fd5e16

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年5月27日 7:04
  • 您好

    1. 使用 Image.RotateFlip 方法 旋转、翻转或者同时旋转和翻转 Image。
    2. 使用 Image.Save 方法 将此图像以指定的格式保存到指定的流中。


    歡迎參觀我的Blog【菜鳥自救會】

    2013年5月27日 8:19
  • 最大的困难是,我图像在界面已经绑定了图片的路径,所以旋转后在保存时,图片已经被占用了。。。。

    程序人生

    2013年5月27日 13:27
  • 最大的困难是,我图像在界面已经绑定了图片的路径,所以旋转后在保存时,图片已经被占用了。。。。

    程序人生

    刚才我看下Windows图片查看器程序,图片在显示的时,当旋转图片并不能同时保存到文件中的,而是关闭图片查看器,图片才被保存的,所以保存操作时在退出了程序才保存的,你说遇到的问题完全是对的,怎么可能在绑定的时候又同时保存到图片呢? 所以你可以把保存操作放在退出程序事件中处理就搞定了

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年5月27日 13:33
  • 能否实现:指定图片的路径,在代码里把指定的图像进行旋转,经过代码操作后,我下次去硬盘里看图像时,图像已经旋转了。  有Demo更好,非常感谢


    程序人生

    2013年5月28日 2:57
  • 你给的连接都是在内存中对图像进行旋转和翻转操作,我要操作硬盘里的图像怎么办?就是给一个路径,然后把指定路径的图像在硬盘里进行旋转操作。

    程序人生

    2013年5月28日 3:02
  • // 对文件进行旋转的方法 
    public static Bitmap RotateImg(Bitmap bmp, float angle, Color bkColor)
            {
                int w = bmp.Width;
                int h = bmp.Height;
                PixelFormat pf = default(PixelFormat);
                if (bkColor == Color.Transparent)
                {
                    pf = PixelFormat.Format32bppArgb;
                }
                else
                {
                    pf = bmp.PixelFormat;
                }
    
                Bitmap tempImg = new Bitmap(w, h, pf);
                Graphics g = Graphics.FromImage(tempImg);
                g.Clear(bkColor);
                g.DrawImageUnscaled(bmp, 1, 1);
                g.Dispose();
    
                GraphicsPath path = new GraphicsPath();
                path.AddRectangle(new RectangleF(0f, 0f, w, h));
                Matrix mtrx = new Matrix();
                //Using System.Drawing.Drawing2D.Matrix class 
                mtrx.Rotate(angle);
                RectangleF rct = path.GetBounds(mtrx);
                Bitmap newImg = new Bitmap(Convert.ToInt32(rct.Width), Convert.ToInt32(rct.Height), pf);
                g = Graphics.FromImage(newImg);
                g.Clear(bkColor);
                g.TranslateTransform(-rct.X, -rct.Y);
                g.RotateTransform(angle);
                g.InterpolationMode = InterpolationMode.HighQualityBilinear;
                g.DrawImageUnscaled(tempImg, 0, 0);
                g.Dispose();
                tempImg.Dispose();
                return newImg;
            }
            public Form1()
            {
                InitializeComponent();
                pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
    Image tempImage=Image.FromFile(@"C:\image.jpg");
    
                pictureBox1.Image = tempImage;            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
                Bitmap bitmap = (Bitmap)pictureBox1.Image;
                pictureBox1.Image = (Image)(RotateImg(bitmap, 30.0f, Color.Transparent));
    // 释放资源,
    tempImage.Dispose();
    
            }
    
    // 在窗体关闭的时候保存文件到指定路径
    // 这里文件路径你可以是由用户选择,你可以根据这个代码进行修改下
    public Form_Closed(object sender,EventArgs e)
    {
    File.Delete(@"C:\image.jpg")
    Image.Save(@C:\image.jpg);
    }


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年5月28日 3:05
  • 你给的连接都是在内存中对图像进行旋转和翻转操作,我要操作硬盘里的图像怎么办?就是给一个路径,然后把指定路径的图像在硬盘里进行旋转操作。

    程序人生

    我下面的代码示例演示了,大概意思是把翻转后的图片保存到硬盘中,晚上我会发布一个完整的图片查看器的例子的博文出来,请注意关注我的博客:http://www.cnblogs.com/zhili/, 你可以先用我下面的示例代码试试看的,主要代码我都已经贴出来了。

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年5月28日 3:07
  • 我按这个方法旋转后,图像变小了,而且用windows照片查看器查看时,图像总是位于顶端,不像那种用windows自带的照片查看器那种旋转效果


    程序人生

    2013年5月28日 5:18
  • 我按这个方法旋转后,图像变小了,而且用windows照片查看器查看时,图像总是位于顶端,不像那种用windows自带的照片查看器那种旋转效果

    程序人生

    2013年5月28日 5:21
  • 我按这个方法旋转后,图像变小了,而且用windows照片查看器查看时,图像总是位于顶端,不像那种用windows自带的照片查看器那种旋转效果


    程序人生

    你需要把Zoom该成这个试试了
     pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年5月28日 5:22
  • 我没有用pictureBox1这个控件,我的方法是这样的:

     private void button2_Click(object sender, EventArgs e)
            {
                  byte[] bytes = File.ReadAllBytes(txtTiffFilePath.Text);
                    using (var ms = new MemoryStream(bytes))
                    using (Image tiff = Image.FromStream(ms))
                    {
                        File.Delete(txtTiffFilePath.Text);
                        //Image img = Image.FromFile(txtTiffFilePath.Text);

                        Bitmap bitmap = (Bitmap)tiff;
                        Image afterImg = (Image)(RotateImg(bitmap, 90.0f, Color.Transparent));
                        afterImg.Save(txtTiffFilePath.Text);
                        MessageBox.Show("图像旋转成功!");
                    }

            }

    所以图像旋转后大小变了,旋转的方法还是你那个


    程序人生

    2013年5月28日 10:13
  • 你保存文件应该使用Image.Save(txtTiffFilePath.Text,ImageFormat.Png)方式保存,这样就不会变小了,不一定是ImageFormat.Png这个格式,要根据你文件的格式对应

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年5月28日 14:23
  • 我照你的方法做了,还是一样,你可以测试一下,真的


    程序人生

    2013年5月29日 1:27
  • 我照你的方法做了,还是一样,你可以测试一下,真的


    程序人生

    我用到了PictureBox控件的,你直接修改内存中数据可能会这样吧

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年5月29日 2:09
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Bitmap bmp; Bitmap tempbmp; private void Form1_MouseDoubleClick(object sender, MouseEventArgs e) { DialogResult dr = openFileDialog1.ShowDialog(); if (dr==DialogResult.OK) { bmp = new Bitmap(openFileDialog1.FileName);

    // 旋转方法可以调用自己实现 bmp.RotateFlip(RotateFlipType.Rotate90FlipNone); tempbmp = (Bitmap)bmp.Clone(); this.Width = tempbmp.Width; this.Height = tempbmp.Height; this.BackgroundImage = tempbmp; tempbmp.Save(openFileDialog1.FileName); } } private void Form1_Load(object sender, EventArgs e) { } } }


    2013年5月30日 2:29
  • 你好,我已经把这个需求详细的实现出来了,具体你可以参考我的这篇文章:

    http://www.cnblogs.com/zhili/archive/2013/06/02/PictureView.html


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. my sample

    2013年6月2日 10:14