在 Visual Studio 中裁剪带有图形的图像会更改文件类型 headers
Cropping Image with Graphics in Visual Studio changes file type headers
我正在尝试裁剪图像并将其保存到服务器。我遇到的问题是,我遵循的裁剪过程似乎对 jpeg 和 jpg 图像有一个 side-effect。
我正在尝试的 process-method 与我在许多关于在 asp.net 中裁剪图像的帖子中发现的略有不同,因为我使用的是 byte[] 作为图像。
public static byte[] CropImage(byte[] imgBytes, Rectangle rec)
{
MemoryStream ms = new MemoryStream(imgBytes);
Image img = Image.FromStream(ms);
Bitmap croppedBmpImage = new Bitmap(200, 200);
using (Graphics gr = Graphics.FromImage(croppedBmpImage))
{
gr.SmoothingMode = SmoothingMode.HighQuality;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(img, new Rectangle(0, 0, 200, 200),
rec,
GraphicsUnit.Pixel);
}
ImageConverter converter = new ImageConverter();
byte[] result = (byte[]) converter.ConvertTo(croppedBmpImage, typeof(byte[]));
croppedBmpImage.Dispose();
return result;
}
图像已正确裁剪,在我的计算机中没有任何预览问题。但是,我正在使用 Alfresco 存储图像,我发现应用程序内的缩略图预览不适用于图像。据我所知,这只发生在 .jpg 和 .jpeg 图像上。根据我的阅读,.jpg 和 .jpeg 图像在其中存储了一些元数据,这些元数据似乎已从我裁剪后的图像中删除。
当我用记事本打开原始 .jpg 或 .jpeg 图像时,我注意到它以一些元数据细节之王(例如 JFIF)开头。 (Ψð JFIF H H Ϋ „ )
另一方面,当我用记事本打开 .png 图像时,我注意到它以
开头
‰PNG
我的裁剪图像也是在裁剪过程后开始的。有什么方法可以保留原始元数据或从一开始就将图像裁剪为 .jpg 文件,还是我在这里遗漏了其他内容?
我可以想到两个办法:
- 将字节[]保存为Jpeg图像,然后将新字节发送回用户。
- 创建一个空的 Jpeg,然后附加裁剪后的字节。
第一个选项你可以看一个例子:
public static byte[] CropImage(byte[] imgBytes, Rectangle rec)
{
byte[] result = null;
using (MemoryStream mStream = new MemoryStream(imgBytes))
{
Image img = Image.FromStream(mStream);
Bitmap croppedBmpImage = new Bitmap(200, 200);
using (Graphics graphics = Graphics.FromImage(croppedBmpImage))
{
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.DrawImage(img, new Rectangle(0, 0, 200, 200),
rec,
GraphicsUnit.Pixel);
}
ImageConverter converter = new ImageConverter();
result = (byte[])converter.ConvertTo(croppedBmpImage, typeof(byte[]));
using (MemoryStream jpegStream = new MemoryStream(result))
{
croppedBmpImage.Save(jpegStream, System.Drawing.Imaging.ImageFormat.Jpeg);
Image img1 = Image.FromStream(jpegStream);
img1.Save(@"C:\Users\darellis\Desktop\image1.jpg");
}
croppedBmpImage.Dispose();
}
return result;
}
我正在尝试裁剪图像并将其保存到服务器。我遇到的问题是,我遵循的裁剪过程似乎对 jpeg 和 jpg 图像有一个 side-effect。 我正在尝试的 process-method 与我在许多关于在 asp.net 中裁剪图像的帖子中发现的略有不同,因为我使用的是 byte[] 作为图像。
public static byte[] CropImage(byte[] imgBytes, Rectangle rec)
{
MemoryStream ms = new MemoryStream(imgBytes);
Image img = Image.FromStream(ms);
Bitmap croppedBmpImage = new Bitmap(200, 200);
using (Graphics gr = Graphics.FromImage(croppedBmpImage))
{
gr.SmoothingMode = SmoothingMode.HighQuality;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(img, new Rectangle(0, 0, 200, 200),
rec,
GraphicsUnit.Pixel);
}
ImageConverter converter = new ImageConverter();
byte[] result = (byte[]) converter.ConvertTo(croppedBmpImage, typeof(byte[]));
croppedBmpImage.Dispose();
return result;
}
图像已正确裁剪,在我的计算机中没有任何预览问题。但是,我正在使用 Alfresco 存储图像,我发现应用程序内的缩略图预览不适用于图像。据我所知,这只发生在 .jpg 和 .jpeg 图像上。根据我的阅读,.jpg 和 .jpeg 图像在其中存储了一些元数据,这些元数据似乎已从我裁剪后的图像中删除。 当我用记事本打开原始 .jpg 或 .jpeg 图像时,我注意到它以一些元数据细节之王(例如 JFIF)开头。 (Ψð JFIF H H Ϋ „ ) 另一方面,当我用记事本打开 .png 图像时,我注意到它以
开头‰PNG
我的裁剪图像也是在裁剪过程后开始的。有什么方法可以保留原始元数据或从一开始就将图像裁剪为 .jpg 文件,还是我在这里遗漏了其他内容?
我可以想到两个办法:
- 将字节[]保存为Jpeg图像,然后将新字节发送回用户。
- 创建一个空的 Jpeg,然后附加裁剪后的字节。
第一个选项你可以看一个例子:
public static byte[] CropImage(byte[] imgBytes, Rectangle rec)
{
byte[] result = null;
using (MemoryStream mStream = new MemoryStream(imgBytes))
{
Image img = Image.FromStream(mStream);
Bitmap croppedBmpImage = new Bitmap(200, 200);
using (Graphics graphics = Graphics.FromImage(croppedBmpImage))
{
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.DrawImage(img, new Rectangle(0, 0, 200, 200),
rec,
GraphicsUnit.Pixel);
}
ImageConverter converter = new ImageConverter();
result = (byte[])converter.ConvertTo(croppedBmpImage, typeof(byte[]));
using (MemoryStream jpegStream = new MemoryStream(result))
{
croppedBmpImage.Save(jpegStream, System.Drawing.Imaging.ImageFormat.Jpeg);
Image img1 = Image.FromStream(jpegStream);
img1.Save(@"C:\Users\darellis\Desktop\image1.jpg");
}
croppedBmpImage.Dispose();
}
return result;
}