C#保存处理过后的图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#保存处理过后的图片相关的知识,希望对你有一定的参考价值。

已用C#的GDI+实现了图片绕任意点旋转任意角度的算法,现在想要把这个图片旋转好后保存成为另外一张JPG,应该再调用哪个函数呢?
程序代码如下:
private void button1_Click(object sender, EventArgs e)

Graphics graphics = this.CreateGraphics();
Graphics oldgraphics = graphics; //保存现场
Bitmap bitmap = new Bitmap("starsky.jpg");
graphics.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height);
double m = 30f / 180f * Math.PI;
float cost = (float)Math.Cos(m);
float sint = (float)Math.Sin(m);
float w = bitmap.Width;
float h = bitmap.Height;
float x = w;
float y = h;
Pen p = new Pen(Color.White, 20f);

float xp = x * cost - y * sint;
float yp = x * sint + y * cost;

float deltax = cost * (x - xp) + sint * (y - yp);
float deltay = -sint * (x - xp) + cost * (y - yp); //变换基下的坐标变换

graphics.RotateTransform(30f);
graphics.TranslateTransform(deltax,deltay);
graphics.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height);

程序执行效果如图所示。

bitmapsave.save("路径+文件名")
如:C:\\\\a\\\\b.jpg

不好意思,没看清你的代码:
把Graphics graphics = this.CreateGraphics();修改为
bitmap bitmapsave = new bitmap();
Graphics graphics = Graphics.fromImage(bitmapsave);
这样应该就好了!!哈阿海
参考技术A nan

使用c#将文件(从流)保存到磁盘[重复]

【中文标题】使用c#将文件(从流)保存到磁盘[重复]【英文标题】:saving a file (from stream) to disk using c# [duplicate] 【发布时间】:2011-06-27 12:47:41 【问题描述】:

可能重复:How do I save a stream to a file?

我有一个流对象,它可能是图像或文件(msword、pdf),我决定以非常不同的方式处理这两种类型,因为我可能想要优化/压缩/调整大小/生成缩略图等。我称之为图片保存到磁盘的具体方法,代码:

var file = StreamObject;

//if content-type == jpeg, png, bmp do...
    Image _image = Image.FromStream(file);
    _image.Save(path);

//if pdf, word do...

我如何实际保存 word 和 pdf?

//multimedia/ video?

我已经看过了(可能不够努力),但我在任何地方都找不到...

【问题讨论】:

对不起,误读了问题... 看看这里如果其中任何一个不起作用。 ***.com/questions/13100666/… 【参考方案1】:

如果您使用的是 .NET 4.0 或更高版本,您可以使用此方法:

public static void CopyStream(Stream input, Stream output)

    input.CopyTo(output);

如果没有,请使用这个:

public static void CopyStream(Stream input, Stream output)

    byte[] buffer = new byte[8 * 1024];
    int len;
    while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
    
        output.Write(buffer, 0, len);
        

以及如何使用它:

using (FileStream output = File.OpenWrite(path))

    CopyStream(input, output);

【讨论】:

由于上面的代码是从this SO answer复制而来的,我相信对原始答案的引用已经到位。 你确定吗?也许来自this one?或者可能来自Spring.NET source?我猜这个实现更老了。也许我现在使用了乔恩答案中的代码,但我不记得了,因为那是差不多 4 年前的事了;)【参考方案2】:

对于文件类型,您可以依赖 FileExtentions,对于将其写入磁盘,您可以使用 BinaryWriter。或FileStream。

示例(假设您已经有一个流):

FileStream fileStream = File.Create(fileFullPath, (int)stream.Length);
// Initialize the bytes array with the stream length and then fill it with data
byte[] bytesInStream = new byte[stream.Length];
stream.Read(bytesInStream, 0, bytesInStream.Length);    
// Use write method to write to the file specified above
fileStream.Write(bytesInStream, 0, bytesInStream.Length);
//Close the filestream
fileStream.Close();

【讨论】:

我将如何实际保存到磁盘,示例代码? 谢谢,我也将文件流包装在 using 语句中... 我只是给出了一个示例代码..你没有要求最佳实践..任何方式都很好 最好将 FileStream 放在 using 语句中,同时在 using 语句中使用 MemoryStream(bytesInStream)。 我将其否决为危险代码Stream.Read 不保证它将完成指定长度的读取 (bytesInStream.Length)。这就是为什么它返回一个表示实际读取量的值的原因。通过忽略此返回值并且在amtReturned < bytesInStream.Length 的情况下未正确执行,此代码是一种危险的维护危险,有时可能会起作用(对于短流),但很快就会在您的脸上炸毁或之后。 不要使用此代码【参考方案3】:

我不得不引用 Jon(c# 大师)Skeet:

嗯,最简单的方法是 打开一个文件流然后使用:

byte[] 数据 = memoryStream.ToArray(); fileStream.Write(数据, 0, 数据长度);

虽然这样效率相对较低, 因为它涉及复制缓冲区。 对于小溪流很好,但对于 大量数据,你应该 考虑使用:

fileStream.Write(memoryStream.GetBuffer(), 0、memoryStream.Position);

【讨论】:

【参考方案4】:

对于文件流:

//Check if the directory exists
if (!System.IO.Directory.Exists(@"C:\yourDirectory"))

    System.IO.Directory.CreateDirectory(@"C:\yourDirectory");


//Write the file
using (System.IO.StreamWriter outfile = new System.IO.StreamWriter(@"C:\yourDirectory\yourFile.txt"))

    outfile.Write(yourFileAsString);

【讨论】:

【参考方案5】:

如果数据已经有效并且已经包含 pdf、word 或图像,那么您可以使用 StreamWriter 并保存它。

【讨论】:

任何代码示例?我目前得到: StreamWriter filewriter = new StreamWriter(file);我想保存到磁盘上的特定位置【参考方案6】:

只需使用简单的文件流即可。

var sr1 = new FileStream(FilePath, FileMode.Create);
                sr1.Write(_UploadFile.File, 0, _UploadFile.File.Length);
                sr1.Close();
                sr1.Dispose();

_UploadFile.File 是一个字节[],在 FilePath 中您可以指定文件扩展名。

【讨论】:

FileStream.Close() 和 FileStream.Dispose() 是同一个东西——没有理由同时使用它们。

以上是关于C#保存处理过后的图片的主要内容,如果未能解决你的问题,请参考以下文章

图片保存到数据库以及C#读取图片

HALCON 怎么处理 C# 已经读取好的图片?

c#中画图与保存

用c#编写一个程序读取一张bmp图片的数据并转化为灰度图保存到文件中

c# 保存图片文件 winform

C#队列怎么保存图片