Tag: 位图

c#GDI边缘空白检测算法

我正在寻找一种从c#托管的GDI +库中检测 c#位图的边缘空白的解决方案。 图像可以是透明的或白色的 ,400x图像中的大多数是8000x8000px,边缘周围有大约2000px的空白。 找出边缘, x,y,高度和宽度坐标的最有效方法是什么? 我尝试逐像素,但发现它很慢。 更新到解决方案 –添加左/右/上/下边界 图像细节中心图像的问题现在裁剪任何透明(0%)或白色(#FFFFFF)像素。 var top = bitmap.Height; var left = bitmap.Width; var right = 0; var bottom = 0; … var pData = pData0 + (y * data.Stride) + (x * 4); var xyAlpha = pData[3]; var xyBlue = pData[0]; var xyGreen = pData[1]; var xyRed = […]

更改照片的“DateTaken”

我刚刚从美国旅行回来,在编辑完所有照片之后,我发现相机使用的是以色列时区,而不是美国人。 有7个小时的时差,所以对我来说这是个大问题。 我有175GB的照片,但我只关心350张照片。 我无法手动编辑他们的EXIF,所以我想到了使用C#。 这个想法是它将读取每张照片的EXIF,获取时间,并在原始照片中设置时间减去7小时。 我尝试使用Image类,但它不起作用。 我尝试使用bitmapMetadate,它有效! 我已经设法得到时间,做了零下7个小时,但我不知道如何保存它。 我该怎么做? 谢谢! public static string PhotoToBeEdited(FileInfo f) { FileStream fs = new FileStream(f.FullName, FileMode.Open, FileAccess.Read, FileShare.Read); BitmapSource img = BitmapFrame.Create(fs); BitmapMetadata md = (BitmapMetadata)img.Metadata; string date = md.DateTaken; Console.WriteLine(date); DateTime dt= DateTime.Parse(date); date = dt.AddHours(-7).ToString(); […] return date; }

C#填充多边形的一侧

在c#中,我可以在位图图像中填充多边形,如下所示。 using (Graphics g = Graphics.FromImage(bitmap)) { g.FillPolygon(colorBrush, points.ToArray()); } FillPolygon方法填充多边形内的像素,在这种情况下,白色像素和黑色像素保持不变。 现在,我想要与此操作相反。 这意味着,外部像素将被填充,内部像素将保持不变。 在这种情况下,黑色像素是外部像素。 编辑我需要这个,因为我要说,我有一个对象的二进制图像。 我需要用背景颜色(黑色)剪切像素,白色多边形内的像素将保持不变。

将隐藏的消息写入图像文件c#

我正在寻找一个教程,其中描述了如何使用C#将隐藏文本写入/读取到图像文件中,但遗憾的是我发现了关于此的任何好post,所以我决定在这里询问这个小技巧。 假设我有一个名为test.jpg的图像文件,有没有办法在这个文件中写一个像“Hello word”这样的隐藏文本? 我已经阅读了有关图像元数据的内容,我想我应该尝试以某种方式编写这个元数据,但我不知道如何找到。 如果有人知道该怎么做,请帮助我理解如何做到这一点。 谢谢。

字符转换为位图图像C#

我需要一个字符串数组,例如: a[] = {A,B,C,…,Z}然后从数组中随机选择一个字母并从其上应用windows目录中的字体,然后渲染具有特定宽度和高度的位图图像forms的特定字母(例如,在我的表单中的图像框中将其显示为位图图像)。

C#:使用Bitmaps时如何减少内存和CPU消耗?

我有一个Windows应用程序项目,处理图像编辑(裁剪和resize)。 不幸的是,这些图像处理消耗了大量的内存和CPU资源(很容易达到600MB或50%cpu),而且只需裁剪和调整一个重量为2.5MB(2300 * 5400px)的gif图像。 更重要的是,由于大量的资源消耗,程序在resize时卡住… public static Image Resize(Image imgToResize, Size size) { Bitmap b = new Bitmap(size.Width, size.Height); Graphics g = Graphics.FromImage((Image)b); g.InterpolationMode = InterpolationMode.Default; g.SmoothingMode = SmoothingMode.HighSpeed; g.PixelOffsetMode = PixelOffsetMode.Default; g.DrawImage(imgToResize, 0, 0, size.Width, size.Height); g.Dispose(); return (Image)b; } public static Image Crop(Image img, Point p1, Point p2) { Rectangle cropArea = new […]

如何将Bitmap转换为byte 更快?

我写了函数: public static byte[, ,] Bitmap2Byte(Bitmap image) { int h = image.Height; int w = image.Width; byte[, ,] result= new byte[w, h, 3]; for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { Color c= image.GetPixel(i, j); result[i, j, 0] = cR; result[i, j, 1] […]

在WPF中不断绘制大量位图的最佳方法是什么?

我被这个非常简单的问题困扰了。 我正在制作基于图块的游戏引擎,并且需要能够允许用户使用WPF用户界面编辑地图。 天真的,我以为我可以简单地使用Graphics.FromImage不断更新一个好的老式“缓冲”System.Drawing.Graphics.Bitmap。 我会在位图上绘制构成地图的图块,然后将缓冲区Bitmap blit到屏幕上。 然而,根据我的深入研究,我现在相信它并不容易。 而不是让我厌倦了迄今为止我发现的东西(要么不起作用,要么非常慢),我可以非常简单地问一下,通过WPF UI连续有效地绘制大量位图的最佳方法是什么? 我会接受“回到Windows窗体”这样的建议。 如果是这样的话,那么我对WPF非常失望!

无论如何在asp图像控件上显示动态生成的Bitmap?

在我的代码中,我使用c#和ASP.NET动态创建一个位图。 比我需要在asp图像控件上显示它。 无论如何都可以使用处理程序吗?

直接读取和写入Unlocked Bitmap非托管内存(Scan0)

从解锁的Bitmap非托管内存直接写入和读取是否可以? 在我解锁Bitmap后,我可以继续使用BitmapData吗? 我做了一个测试应用程序,我可以在鼠标位置读取PictureBox的Bitmap像素,而另一个线程正在将像素写入同一个Bitmap。 编辑1:正如Boing在他的回答中指出的那样:“Scan0没有指向Bitmap对象的实际像素数据;而是指向一个临时缓冲区,它表示Bitmap对象中像素数据的一部分。” 来自MSDN 。 但是一旦我获得Scan0,我就能够读取/写入位图而无需Lockbits或UnlockBits! 我在一个post里做了很多次。 相对于MSDN,它不应该发生,因为Scan0指向位图数据的COPY! 好吧,在C#中,所有测试都显示它不是副本。 在C ++中,我不知道它是否正常工作。 编辑2:使用旋转方法有时会使操作系统释放位图像素数据副本。 结论, it is not safe to read/write an unlocked Bitmap Scan0 。 谢谢Boing的回答和评论! 下面是我如何获取BitmapData并读取和写入像素值。 /// /// Locks and unlocks the Bitmap to get the BitmapData. /// /// Bitmap /// BitmapData public static BitmapData GetBitmapData(Bitmap bmp) { BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, […]