C# 裁剪图像并转换为PNG
伙计们,我正在尝试裁剪图像并将其保存为PNG 我可以很好地裁剪它,但是图像没有正确地保存为PNG——它被保存为JPEG或任何原始格式仅当用户决定不裁剪图像时。 这就是我的意思,即使我设置了C# 裁剪图像并转换为PNG,c#,.net,gdi+,gdi,image-conversion,C#,.net,Gdi+,Gdi,Image Conversion,伙计们,我正在尝试裁剪图像并将其保存为PNG 我可以很好地裁剪它,但是图像没有正确地保存为PNG——它被保存为JPEG或任何原始格式仅当用户决定不裁剪图像时。 这就是我的意思,即使我设置了ImageFormat.Png图像也会保存为JPEG 以下是我正在使用的代码: private byte[] ResizeImage2(string resizeInfo) { string[] picInfo = resizeInfo.Split('|'); int width = int
ImageFormat.Png
图像也会保存为JPEG
以下是我正在使用的代码:
private byte[] ResizeImage2(string resizeInfo)
{
string[] picInfo = resizeInfo.Split('|');
int width = int.Parse(picInfo[0]);
int height = int.Parse(picInfo[1]);
int targetWidth = int.Parse(picInfo[2]);
int targetHeight = int.Parse(picInfo[3]);
int x = int.Parse(picInfo[4]);
int y = int.Parse(picInfo[5]);
using (var fileStore = new EPMLiveFileStore(Web))
{
using (var sourceImage = new Bitmap(fileStore.GetStream(FileNameField.Value)))
{
using (var bitmap = new Bitmap(width, height))
{
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.DrawImage(sourceImage, new Rectangle(0, 0, width, height));
using (var memoryStream = new MemoryStream())
{
bitmap.Save(memoryStream, ImageFormat.Png);
using (var bmp = new Bitmap(bitmap))
{
using (var pic = bmp.Clone(new Rectangle(x, y, targetWidth, targetHeight), bitmap.PixelFormat))
{
using (var stream = new MemoryStream())
{
pic.Save(stream, ImageFormat.Png);
return stream.ToArray();
}
}
}
}
}
}
}
}
}
我对你的代码做了一些更改。该方法返回整个PNG文件,表示为
字节
数组(不确定这是否是您想要实现的):
由于只进行裁剪(不执行重采样),因此可能不需要以下行:
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.SmoothingMode = SmoothingMode.HighQuality;
以Jigstore和Simplify为例,我认为您可以使用以下方法:
private byte[] ResizeImage2(string resizeInfo)
{
string[] picInfo = resizeInfo.Split('|');
int width = int.Parse(picInfo[0]);
int height = int.Parse(picInfo[1]);
int targetWidth = int.Parse(picInfo[2]);
int targetHeight = int.Parse(picInfo[3]);
int x = int.Parse(picInfo[4]);
int y = int.Parse(picInfo[5]);
using (var fileStore = new EPMLiveFileStore(Web))
{
using (Bitmap sourceImage = new Bitmap(fileStore.GetStream(FileNameField.Value)))
{
using (var bitmap = new Bitmap(width, height))
{
bitmap.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.DrawImageUnscaled(sourceImage, Point.Empty);
using (var memoryStream = new MemoryStream())
{
bitmap.Save(memoryStream, ImageFormat.Png);
return (byte[]) memoryStream.ToArray();
}
}
}
}
}
}
顺便说一下,您将丢失原始文件中的所有元数据。这将是EXIF信息和JPEG中的缩略图,仅举几个例子。如果您想保留此信息,我建议您通过命令行()使用如下工具。您是否尝试过另一个采用ImageFormat参数的Bitmap.Save()方法重载?我添加了屏幕截图。它对我来说很好(即使我“裁剪”整个图像,实际上没有裁剪),文件保存为PNG,我用十六进制编辑器检查了一下。顺便说一句,您的版本似乎没有保留DPI设置。如果你上传的图像可能与MIME类型有关。
private byte[] ResizeImage2(string resizeInfo)
{
string[] picInfo = resizeInfo.Split('|');
int width = int.Parse(picInfo[0]);
int height = int.Parse(picInfo[1]);
int targetWidth = int.Parse(picInfo[2]);
int targetHeight = int.Parse(picInfo[3]);
int x = int.Parse(picInfo[4]);
int y = int.Parse(picInfo[5]);
using (var fileStore = new EPMLiveFileStore(Web))
{
using (Bitmap sourceImage = new Bitmap(fileStore.GetStream(FileNameField.Value)))
{
using (var bitmap = new Bitmap(width, height))
{
bitmap.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.DrawImageUnscaled(sourceImage, Point.Empty);
using (var memoryStream = new MemoryStream())
{
bitmap.Save(memoryStream, ImageFormat.Png);
return (byte[]) memoryStream.ToArray();
}
}
}
}
}
}