我有一个c#应用程序,其中包含一个图像库,我在其中显示一些图片。 这个画廊有一些功能,包括左右旋转。 一切都很完美但是当我从画廊选择一张图片并按下旋转按钮(无论左右旋转)时,图片的大小会显着增加。 应该提到图片的格式是JPEG。
旋转前的图片尺寸:278 kb
旋转后的图片尺寸:780 kb
我的轮换代码如下:
public Image apply(Image img)
{
Image im = img;
if (rotate == 1) im.RotateFlip(RotateFlipType.Rotate90FlipNone);
if (rotate == 2) im.RotateFlip(RotateFlipType.Rotate180FlipNone);
if (rotate == 3) im.RotateFlip(RotateFlipType.Rotate270FlipNone);
//file size is increasing after RotateFlip method
if (brigh != DEFAULT_BRIGH ||
contr != DEFAULT_CONTR ||
gamma != DEFAULT_GAMMA)
{
using (Graphics g = Graphics.FromImage(im))
{
float b = _brigh;
float c = _contr;
ImageAttributes derp = new ImageAttributes();
derp.SetColorMatrix(new ColorMatrix(new float[][]{
new float[]{c, 0, 0, 0, 0},
new float[]{0, c, 0, 0, 0},
new float[]{0, 0, c, 0, 0},
new float[]{0, 0, 0, 1, 0},
new float[]{b, b, b, 0, 1}}));
derp.SetGamma(_gamma);
g.DrawImage(img, new Rectangle(Point.Empty, img.Size),
0, 0, img.Width, img.Height, GraphicsUnit.Pixel, derp);
}
}
return im;
}
有什么问题? 谢谢你提前。
答案 0 :(得分:6)
如果您在RotateFlip
上应用im
,则会将ImageFormat
从Jpeg
更改为MemoryBmp
。
保存图像时默认使用默认值ImageFormat
。这将是im.RawFormat
如果您检查GUID im.RawFormat.Guid
在RotateFlip之前
{b96b3cae-0728-11d3-9d7b-0000f81ef32e}
与ImageFormat.Jpeg.Guid
RotateFlip
之后 {b96b3caa-0728-11d3-9d7b-0000f81ef32e}
与ImageFormat.MemoryBmp.Guid
在保存图像时,将ImageFormat
作为第二个参数传递,这将确保它使用正确的格式。如果没有提到它将成为im.RawFormat
所以如果你想在保存电话时保存为jpeg
im.Save("filename.jpg", ImageFormat.Jpeg);
这次文件大小应小于原始大小。
另请注意ImageFormat
位于System.Drawing.Imaging
名称空间
注意强>
要控制jpeg的质量,请使用此MSDN Link
中提到的重载Save方法基于评论的编辑
好的,假设您正在使用SQL Server,您必须拥有image
数据类型列(建议使用varbinary(max)
而不是image
,因为将来它将成为obselete( Read MSDN Post)
现在执行
1) read the contents as a stream / byte[] array
2) convert this to Image
3) perform rotate operation on the Image
4) convert this Image back to stream / byte[] array
5) Update the database column with the new value
答案 1 :(得分:1)
有两个原因:
答案 2 :(得分:0)
您应该在更改图像之前保持原始ImageFormat
,并按原始图像格式保存到文件。像贝娄代码:
using (Image image = Image.FromFile(filePath))
{
var rawFormat = image.RawFormat;
image.RotateFlip(angel);
image.Save(filePath, rawFormat);
}