Tag: 位图

C# – 转换8位或16位灰度原始像素数据

我需要能够将8位或16位灰度像素数据转换为.NET框架可以支持的文件格式。 我可用的数据是宽度,高度,方向(左下角)和像素格式,以每像素2个字节打包的4096灰度(12位分辨率)。 因此,例如,每个像素的范围从0到4096,并且每个像素是2个字节。 我已经尝试将PixelFormat.Format16bppGrayScale与Bitmap构造函数一起使用,并抛出GDI +exception。 我读过的所有内容都说不支持这种格式,并且MSDN错误。 我想将此像素缓冲区转换为.NET位图格式(如Format32bppArgb),尽可能减少图像质量损失。 谁知道怎么样?

原始像素数组到灰度BitmapImage

我有一组原始像素数据。 我想将其转换为8bpp Bitmap。 public static Bitmap ByteToGrayBitmap(byte[] rawBytes, int width, int height) { Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed); BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, bitmap.PixelFormat); Marshal.Copy(rawBytes, 0, bitmapData .Scan0, rawBytes.Length); bitmap.UnlockBits(bitmapData); return bitmap; } 位图看起来像彩色图像而不是灰度。

C# – 将图像复制到8位索引图像中

我想从常规的32位Image对象创建一个8位索引图像。 Bitmap img = new Bitmap(imgPath); // 32-bit Bitmap img8bit = new Bitmap(imgW, imgH, Format8bppIndexed); // 8-bit // copy img to img8bit — HOW? img8bit.Save(imgNewPath, ImageFormat.Png); 我不能使用SetPixel来逐个像素地复制它,因为Graphics不能与索引图像一起使用。 能怎样?

在位图图像中设置背景颜色

我想将canvas保存为图像。 它有效,但背景颜色为黑色。 如何添加以改变颜色? 我用这个代码: Size size = new Size(surface.Width, surface.Height); surface.Measure(size); surface.Arrange(new Rect(size)); // Create a render bitmap and push the surface to it RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32); renderBitmap.Render(surface); // Create a file stream for saving image using (FileStream outStream = new FileStream(filename, FileMode.Create)) { BmpBitmapEncoder encoder = new BmpBitmapEncoder(); […]

如何捕获此WPF位图加载exception?

我正在开发一个应用程序,它使用.NET 3.5 sp1和C#从Web加载位图。 加载代码如下所示: try { CurrentImage = pics[unChosenPics[index]]; bi = new BitmapImage(CurrentImage.URI); // BitmapImage.UriSource must be in a BeginInit/EndInit block. bi.DownloadCompleted += new EventHandler(bi_DownloadCompleted); AssessmentImage.Source = bi; } catch { System.Console.WriteLine(“Something broke during the read!”); } 并且在bi_DownloadCompleted上加载的代码是: void bi_DownloadCompleted(object sender, EventArgs e) { try { double dpi = 96; int width = bi.PixelWidth; int […]

异步加载BitmapSource映像时内存泄漏

我有一些我正在加载到WPF应用程序中的ListBox中的图像。 最初我使用GDI来调整图像大小(原件占用的内存太多)。 这很好,除了他们每张图片大约需要400毫秒。 不太好。 因此,在寻找另一种解决方案时,我发现了一种使用TransformedBitmap(inheritance自BitmapSource)的方法。 那很好,我想,我可以用它。 除了我现在正在某处发生内存泄漏…… 我正在使用BackgroundWorker异步加载图像,如下所示: BitmapSource bs = ImageUtils.ResizeBitmapSource(ImageUtils.GetImageSource(photo.FullName)); //BitmapSource bs = ImageUtils.GetImageSource(photo.FullName); bs.Freeze(); this.dispatcher.Invoke(new Action(() => { photo.Source = bs; })); GetImageSource只从路径获取Bitmap,然后转换为BitmapSource。 这是ResizeBitmapSource的代码片段: const int thumbnailSize = 200; int width; int height; if (bs.Width > bs.Height) { width = thumbnailSize; height = (int)(bs.Height * thumbnailSize / bs.Width); } else { height […]

C#内存在Bitmap中泄漏

我的应用程序在这行中出现内存泄漏。如果我看一下任务管理器,每次触发此过程时,RAM内存增加+ – 300 MB .. Bitmap bmp1 = new Bitmap(2480, 3508); panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508)); pictureBox2.Image = bmp1; 有人可以帮我解决他的泄漏吗? 如果我使用: bmp1.Dispose(); 我在这行的“Program.cs”中得到一个例外: Application.Run(new Form1()); 在此之后,应用程序停止运行… 屏幕应用:

在C#中的单色位图上绘制文本

我的问题是我需要在单色位图上绘制文本。 生成的位图必须打印在热敏POS打印机上,因此位图必须为1bpp。 我的图形不好,所以我试图找一些样品。 这是我尝试过的: Bitmap bmp = new Bitmap(300, 300, PixelFormat.Format1bppIndexed); using (Graphics g = Graphics.FromImage(bmp)) { Font font = new Font(“Arial”, 20, FontStyle.Bold, GraphicsUnit.Point); g.Clear(Color.White); g.DrawString(text, font, Brushes.Black, 0, 0); } bmp.Save(@”c:\x\x.bmp”, ImageFormat.Bmp); 最后保存只是为了检查结果。 使用此代码,我得到以下exception:无法从具有索引像素格式的图像创建Graphics对象。 是否有任何方法可以将文本绘制到单色内存位图? 仅供参考:我需要这个,因为我的愚蠢POS打印机绘制的0与O完全相同,所以它们无法区分……

覆盖两个或多个位图以在Picturebox中显示(C#)

在我的C#程序中,我有一个Picturebox,我想在其中显示video流(连续帧)。 我收到原始数据,然后我转换为Bitmap或Image。 我可以一次显示一个图像而没有问题(重现video流)。 现在我的问题是我想合并两个或更多具有相同大小和alpha值(ARGB)的位图(如图层)并在图片框上显示它 。 我在SO上阅读了很多网站和post,但很多人使用的是Graphics类,我只是无法在我的应用程序上绘制它(很可能是因为我是C#的新手!并且已经安装了我的程序,所以我不想改变结构)。 我需要(知道): 如何使用alpha值覆盖两个或多个位图; 请不要像素操纵,不能承受性能成本。 非常感谢你提前! 注意:我认为这个问题不应该被标记(或关闭)为重复,因为我在SO中找到的所有内容都是通过像素操作或通过Graphics类完成的。 (但我可能错了!) 编辑:可能的解决方法(不是问题的解决方案 ) 在PictureBox问题中 ,第4个答案(来自用户来自)告诉我有2个picturebox,一个在另一个之上。 我必须做的唯一(额外)事情是使它与这种方法一起工作: private void Form1_Load(object sender, EventArgs e) { pictureBox2.Parent = pictureBox1; } 哪个pictureBox2将是顶部的那个。 我不会认为这是这个问题的答案,因为我认为这是一种解决方法(特别是因为有超过10个图片盒似乎不太理想!哈哈)。 这就是为什么我会打开这个问题等待我的问题的真正答案。 编辑:已解决! 检查我的答案。

winforms图形与最近邻居过滤图像的剪切边缘

我正在写一个Chip8模拟器/解释器。 它很棒。 到目前为止,我需要一个用户界面来玩一些游戏并观看这个糟糕的jackson。 我首先遇到了一个问题,即在屏幕上绘制帧缓冲区(这只是一个位图)非常模糊。 搞清楚之后我需要将插值模式设置为最近邻,它看起来好多了,但是看起来图像的边缘要么被剪裁,要么我在工作时误解了插值。 这是一个截图。 您在顶部,左侧和右侧看到的边缘应以“整个”白色像素结束,与您看到的图案保持一致。 特别容易看到左上角的问题,应该是一个完整的白色像素。 被放大的图像是64×32,并且正在使用普通图形对象绘制,如下所示:(忽略64 * 6,我知道它很有趣) g.DrawImage (cpu.raster, 0, 0, 64 * 6, 32 * 6); 其中“cpu.raster”是模拟器渲染游戏的位图。 我会发布剩下的代码,但这看起来很标准。 唯一与图形相关的其他代码是插值/平滑模式,它们设置如下: g = this.CreateGraphics (); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; this.DoubleBuffered = true; 我应该注意另一个设置来防止这种情况吗? 我试着减小绘制图像的大小,想到可能表单是以某种方式剪切它,但事实并非如此,图像结束于您在屏幕截图中看到的边缘。