当我加载一个jpg文件然后转过来并以100的质量保存它并且大小几乎是原始的4倍时,我才真正感到惊讶.为了进一步研究我打开并保存而没有明确设置质量和文件大小完全相同.我认为这是因为没有改变所以它只是将完全相同的位写回文件.为了测试这个假设,我在图像上对角线画了一条大胖线并再次保存而没有设置质量(这次我希望文件跳起来因为它会"脏")但它减少了~10Kb!
此时我真的不明白当我简单地调用Image.Save()时指出压缩质量时发生了什么.当我将质量设置为100(基本上没有压缩)时文件大小比原始大几倍时,文件大小如何接近(在图像修改后)到原始大小时尚未设置质量?
我已经阅读了有关Image.Save()的文档,而且它缺乏关于幕后发生的事情的任何细节.我用谷歌搜索了我能想到的每一种方式,但我找不到任何可以解释我所看到的信息的其他信息.我已经连续工作了31个小时,所以也许我错过了一些明显的东西; 0)
所有这些都是在我实现一些库方法将图像保存到数据库时实现的.我已经重载了我们的"SaveImage"方法以允许明确地设置质量,并且在我的测试期间,我遇到了上面解释的奇怪(对我而言)的结果.任何你可以流下的光都将受到赞赏.
这里有一些代码可以说明我遇到的情况:
string filename = @"C:\temp\image testing\hh.jpg";
string destPath = @"C:\temp\image testing\";
using(Image image = Image.FromFile(filename))
{
ImageCodecInfo codecInfo = ImageUtils.GetEncoderInfo(ImageFormat.Jpeg);
// Set the quality
EncoderParameters parameters = new EncoderParameters(1);
// Quality: 10
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 10L);
image.Save(destPath + "10.jpg", codecInfo, parameters);
// Quality: 75
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 75L);
image.Save(destPath + "75.jpg", codecInfo, parameters);
// Quality: 100
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 100L);
image.Save(destPath + "100.jpg", codecInfo, parameters);
// default
image.Save(destPath + …
Run Code Online (Sandbox Code Playgroud) 经过几天跟踪奇怪的GDI +错误,我偶然发现了MSDN上的这个小宝石:
System.Drawing命名空间中的类不支持在Windows或ASP.NET服务中使用.尝试在其中一种应用程序类型中使用这些类可能会产生意外问题,例如服务性能下降和运行时异常.
我不知道"ASP.NET服务"在这种情况下是否意味着"Web应用程序",但"服务性能降低"当然似乎涵盖了"GDI +中出现一般性错误"和"内存不足"错误的随机分类我的应用程序正在抛出 - 读取和写入JPEG图像的间歇性,不可重现的错误 - 在许多情况下 - 实际上是由System.Drawing.Imaging首先创建的.
那么 - 如果GDI +无法在Web应用程序中可靠地读取和写入JPEG文件,那么我应该使用什么呢?
我希望用户能够上传图像(需要JPEG,其他格式很好),可靠地重新采样,并在出现任何问题时显示有用的错误消息.有任何想法吗?WPF的System.Media命名空间值得考虑吗?
编辑:是的,我知道GDI +"大部分时间都在工作".这还不够好,因为当它失败时,它会以一种无法隔离或优雅地恢复的方式这样做.我对适合您的GDI +代码示例不感兴趣:我正在寻找用于图像处理的替代库.
我的代码枚举了一个元文件:
private void Parse()
{
Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
PointF pointf = new PointF();
graphics.EnumerateMetafile(_metafile, pointf, ParseCallback);
}
private bool ParseCallback(EmfPlusRecordType recordType,
int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
我的开发机器是VirtualBox
Ubuntu主机上的Windows 7 客户机.
用来工作正常的代码.但是,当我关闭Aero时,代码停止工作:ParseCallback
永远不会被调用.
只有当我重新打开Aero时,ParseCallback
才会再次执行.
为什么以及如何使此代码在非启用Aero的计算机上运行?
当我将图像带入我的程序时,我想确定是否:
使用#1很简单Image.IsAlphaPixelFormat
.但是对于#2,除了遍历每个像素之外,还有一种简单的方法可以确定至少有一个像素是否具有使用的alpha通道(即设置为其他值255
)?我需要的只是一个布尔值,然后我将决定是将其保存为32位还是24位.
更新:我发现ImageFlags.HasTranslucent应该为我提供我正在寻找的东西 - 不幸的是,它根本不起作用.例如,具有至少alpha通道为66(半透明)的像素格式的PNG继续报告False
(用法:) if((img.Flags & ImageFlags.HasTranslucent) == 4) ...;
.我已经对所有类型的图像进行了测试,包括.bmp,其alpha值> 0且<255且仍然报告False
.任何人都使用过它并知道它是否适用于GDI +?
对于任何给定的扩展,是否可以获得扩展System.Drawing.Imaging.ImageFormat
?(C#)
例:
System.Drawing.Imaging.ImageFormat.Tiff -> .tif
System.Drawing.Imaging.ImageFormat.Jpeg -> .jpg
...
Run Code Online (Sandbox Code Playgroud)
这可以很容易地作为查找表来完成,但想知道.Net中是否存在任何本地内容.
我对ASP.NET中的图像处理完全不熟悉.我非常熟悉Photoshop,并且在某种程度上对图像有所了解.
我试图找出质量和压缩之间的区别,因为其他应用程序倾向于将它们视为相同.使用system.drawing.imaging有质量和压缩的设置.
http://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoder.quality.aspx上写着:"质量类别指定图像的压缩级别."
http://msdn.microsoft.com/en-us/library/bb882583.aspx上写着:"质量等级0对应于最大压缩,质量等级100对应于最低压缩."
文档似乎可以互换地使用质量和压缩.但是,每个都有设置.有什么不同?
c# asp.net system.drawing image-processing system.drawing.imaging
尝试呼叫时此代码失败Image.Save(MemoryStream, ImageFormat)
.
我得到了例外:
a值不能为null.参数名称:encoder"
ImageFormat format = generatedImage.RawFormat as ImageFormat;
image.ImageData = generatedImage.Save(format);
Run Code Online (Sandbox Code Playgroud)
如果我ImageFormat
直接传入一个对象,它就可以工作了ImageFormat.Jpeg
.
什么是转换的最佳途径rawformat
,以ImageFormat
(最理想的情况switch语句或大量的if语句)
谢谢Ben
我使用以下代码将文本绘制到jpg图像上,但它需要x/y坐标精度来放置文本的位置.
var bmp = new Bitmap("C:\\testing\\Given.jpg");
var gra = Graphics.FromImage(bmp);
var text = "The Berman's";
var font = new Font("Segoe Script", 24);
var brush = Brushes.Orange;
var point = new PointF(130, 224);
gra.DrawString(text, font, brush, point);
bmp.Save("C:\\testing\\Custom.jpg");
Run Code Online (Sandbox Code Playgroud)
我如何将文本居中放在图像上?我猜这将与定义某种容器(矩形可能?),这是图像的宽度和文本的中心?不确定最佳做法是什么.
在尝试使用元数据中设置的软件名称保存图像时,出现异常“指定的 BitmapEncoder 不支持全局元数据。”
我怎样才能做到这一点?
using (Stream stream = File.Create(@"D:\Yourfile.png"))
{
RenderTargetBitmap rtb = new RenderTargetBitmap(600, 400, 300, 300, PixelFormats.Pbgra32);
DrawingVisual dv = new DrawingVisual();
//draw on drawing visual
rtb.Render(dv);
BitmapEncoder encoder = null;
BitmapMetadata metadata = null;
encoder = new JpegBitmapEncoder();
((JpegBitmapEncoder)encoder).QualityLevel = 90;
metadata = new BitmapMetadata("jpg");
metadata.ApplicationName = "My Software Name";
encoder.Metadata = metadata;
BitmapFrame bitmapFrame = BitmapFrame.Create(rtb);
encoder.Frames.Add(bitmapFrame);
encoder.Save(stream);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用EF Code First和Data Scaffolding,并且有一个包含类型属性的实体
public System.Drawing.Image Image { get; set; }
Run Code Online (Sandbox Code Playgroud)
初始化DB上下文以创建数据库时,我会收到以下错误:
System.Data.Edm.EdmEntityType :: EntityType'Image'没有定义键.定义此EntityType的键.
System.Data.Edm.EdmEntitySet:EntityType:EntitySet Images基于没有定义键的Image类型.
关于如何获得这个的任何想法?
mapping ado.net entity-framework system.drawing.imaging entity-framework-4.1