Tag: gdi +

GDI +中发生了一般错误

我使用以下方法将图像加载到Picture Box中: picturebox1.Image = Image.FromFile() 我用以下方法保存它: Bitmap bm = new Bitmap(pictureBox1.Image); bm.Save(FileName, ImageFormat.Bmp); 它在创建新文件时工作得非常好,但是当我尝试替换现有图像时,我会抛出以下运行时错误: GDI +中发生了一般错误 那么我该怎么做才能解决这个问题呢?

WMF / EMF文件格式转换C#

在我的程序中,我需要“回放”或“解析”窗口元文件(WMF和EMF)。 我已经通过MSDN和Google挖掘了,我最接近的是图形。 EnumerateMetafile方法。 我可以让它工作,因为我的EnumerateMetafileProc回调被调用,然后我可以调用PlayRecord。 缺少的是如何从该回调中获取有用的数据。 我查看的示例: http : //msdn.microsoft.com/en-us/library/ms142060.aspx 回调有一个recordType参数,它是一个ENUM。 这看起来很有用,除非它们似乎无法将数据转换为任何有用的类型。 我的目标是回放WMF / EMF的创建,这样我就可以对具有(DrawLine,DrawPoint,DrawArc)等方法的专用图形类进行函数调用。 从某种意义上说,我正在以完全不同的格式(转换)重新创建WMF / EMF绘图。 非常感谢任何帮助。

保存前设置图像元数据

我正在尝试设置退出resize时图像的元数据,该属性似乎已设置但在保存之后没有任何内容。 我很确定我做的任何想法都是愚蠢的。 var pi = createPropertyItem(); pi.Id = 40091; pi.Len = “SomeText”.Length; pi.Type = 2; pi.Value = Encoding.UTF8.GetBytes(“SomeText”); SrcImage.SetPropertyItem(pi); SrcImage.Save(@”C:\temp\withTag.jpg”); private PropertyItem createPropertyItem() { var ci = typeof (PropertyItem); var o = ci.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public , null, new Type[] {} , null); return (PropertyItem)o.Invoke(null); }

如何绘制可选线?

我想创建一个用户能够操纵他绘制的线的应用程序。 删除行或选择它。 我该怎么做? 提前致谢 我设法使用硬编码矩形。 但我仍然不知道如何使用drawLine()我可以使用drawPath进行命中测试吗? 这是代码: private bool selectGraph = false; private Rectangle myrec = new Rectangle(50, 50, 100, 100); private Graphics g; private void panel1_Paint(object sender, PaintEventArgs e) { SolidBrush sb = new SolidBrush(Color.Blue); Pen p = new Pen(Color.Blue, 5); e.Graphics.DrawRectangle(p, myrec); e.Graphics.FillRectangle(sb, myrec); } private void panel1_MouseUp(object sender, MouseEventArgs e) { Point […]

将ICC颜色配置文件应用于C#(Dotnet)中的图像

如何将图像从一种颜色配置文件转换为另一种颜色配置文件(从屏幕到打印机,或扫描到屏幕)。 在Visual C ++中,您将使用ICM.h中的函数,是否有一种托管方式来使用GDI +? 我需要使用GDI +,而不是WPF。 我更喜欢有一个托管解决方案,但如果它不可用,我猜PInkvoke就足够了。

无法将图像渲染到HttpContext.Response.OutputStream

基本上我试图在ASP.NET处理程序中呈现一个简单的图像: public void ProcessRequest (HttpContext context) { Bitmap image = new Bitmap(16, 16); Graphics graph = Graphics.FromImage(image); graph.FillEllipse(Brushes.Green, 0, 0, 16, 16); context.Response.ContentType = “image/png”; image.Save(context.Response.OutputStream, ImageFormat.Png); } 但我得到以下exception: System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+. at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) 解决方案是使用它而不是将图像写入OutputStream: MemoryStream temp = new MemoryStream(); image.Save(temp, ImageFormat.Png); byte[] buffer = temp.GetBuffer(); […]

自动将位图修剪为最小尺寸?

假设我有一个32bpp ARGB模式的System.Drawing.Bitmap 。 这是一个很大的位图,但它主要是完全透明的像素,中间某处有一个相对较小的图像。 检测“真实”图像边界的快速算法是什么,所以我可以裁掉周围的所有透明像素? 或者,我可以使用.Net中的function吗?

C#GDI +图像resizefunction

所以我的逻辑存在缺陷,我需要一种更好,更正确的方法来调整c#app中的图像大小 我需要一个类似于这个设置的function public void ResizeImageForWeb(string OriginalFile, string NewFile, int MaxWidth, int MaxHeight, int Quality) { // Resize Code } 基本上,我是一个网页设计师,试图编写桌面应用程序。

图像调整C#和.NET 3.5的效率

我已经编写了一个Web服务来调整用户上传的图像,并且从function的角度来看,所有这些都可以正常工作,但是每次使用它时都会导致CPU使用率出现峰值。 它在Windows Server 2008 64位上运行。 我已经尝试编译为32位和64位并获得相同的结果。 服务的核心是这个function: private Image CreateReducedImage(Image imgOrig, Size NewSize) { var newBM = new Bitmap(NewSize.Width, NewSize.Height); using (var newGrapics = Graphics.FromImage(newBM)) { newGrapics.CompositingQuality = CompositingQuality.HighSpeed; newGrapics.SmoothingMode = SmoothingMode.HighSpeed; newGrapics.InterpolationMode = InterpolationMode.HighQualityBicubic; newGrapics.DrawImage(imgOrig, new Rectangle(0, 0, NewSize.Width, NewSize.Height)); } return newBM; } 我在服务上放了一个分析器,它似乎表明绝大部分时间花在了GDI +库本身上,而且我的代码中没有太多东西可以获得。 问题:我在这里的代码中做了一些明显低效的事情吗? 它似乎符合我见过的例子。 使用除GDI +之外的库有没有收获? 我看到的基准测试似乎表明GDI +与其他图书馆相比做得很好但我没有发现足够的信心。 使用“不安全代码”块会有收获吗? 如果我没有提供足够的代码,请告诉我…我很乐意尽可能多地提出要求但不想在post中讨厌。

multithreading系统.Windows.Graphics

我当然知道我不能从不同的线程绘制到同一个Graphics对象,但是我也不能在不同的线程中绘制到不同的 Graphics对象吗? 考虑以下控制台程序: class Program { static ThreadDrawer[] drawers; static void Main(string[] args) { int numThreads = 8; drawers = new ThreadDrawer[numThreads]; for (int i = 0; i < numThreads; i++) { drawers[i] = new ThreadDrawer(); drawers[i].Start(); } for (int i = 0; i < numThreads; i++) { drawers[i].Wait(); } Console.WriteLine("Complete."); Console.ReadKey(); } class ThreadDrawer […]