Tag: 位图

如何将List 的值在将其编码为c#中的条形码后添加到List 中

我有两个List一个是字符串,另一个是PictureBox类型。 我想取List类型字符串的值,然后将其转换为条形码,然后将其保存到PictureBox类型的List中。 我现在这样做: List PictureBoxList = new List(); List SerialNumberList = new List(); int SerialNumberStart = 0; for(int i = 0; i < 10 ; i++) { SerialNumberStart++; SerialNumberList.Add("S" + SerialNumberStart); } private void PrintButton_Click(object sender, EventArgs e) { for(int j =0 ; j < SerialNumberList.Count ; j++) { BarcodeLib.TYPE barcodetype1 = BarcodeLib.TYPE.CODE39; BarcodeLib.Barcode bar1 […]

从多个线程渲染到单个Bitmap对象

我正在做的是将多个位图呈现给单个位图。 可能有数百个图像,并且渲染的位图可能超过1000×1000像素。 我希望通过使用多个线程来加快这个过程,但由于Bitmap对象不是线程安全的,因此它不能直接同时呈现。 我想的是将大位图分成每个cpu的部分,分别渲染它们然后在最后将它们连接在一起。 我还没有这样做,但是你们/女孩们有更好的建议。 有任何想法吗? 谢谢

如何仅将8位PNG图像作为8位PNG图像读取?

我有一个8位PNG图像(见附件)。 但是当我使用Image.FromFile方法读取它时,像素格式为32位。 由于这个原因,我无法修改调色板。 请帮我。 请参阅下面的代码,我将用于读取文件和更新调色板。 public static Image GetPreviewImage() { Bitmap updatedImage = null; try { // Reads the colors as a byte array byte[] paletteBytes = FetchColorPallette(); updatedImage = Image.FromFile(@”C:\Screen-SaverBouncing.png”); ColorPalette colorPalette = updatedImage.Palette; int j = 0; if (colorPalette.Entries.Length > 0) { for (int i = 0; i < paletteBytes.Length / 4; i++) […]

来自位图数据的c#RGB值

我是新的使用Bitmap并使用每像素16位Format16bppRgb555 ; 我想从位图数据中提取RGB值。 这是我的代码 static void Main(string[] args) { BitmapRGBValues(); Console.ReadKey(); } static unsafe void BitmapRGBValues() { Bitmap cur = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format16bppRgb555); //Capture Screen var screenBounds = Screen.PrimaryScreen.Bounds; using (var gfxScreenshot = Graphics.FromImage(cur)) { gfxScreenshot.CopyFromScreen(screenBounds.X, screenBounds.Y, 0, 0, screenBounds.Size, CopyPixelOperation.SourceCopy); } var curBitmapData = cur.LockBits(new Rectangle(0, 0, cur.Width, cur.Height), ImageLockMode.ReadWrite, PixelFormat.Format16bppRgb555); try { […]

编辑8bpp索引位图

我正在尝试编辑8bpp的像素。 由于此PixelFormat已编制索引,我知道它使用颜色表来映射像素值。 即使我可以通过将位图转换为24bpp来编辑位图,但8bpp编辑速度要快得多(13ms vs 3ms)。 但是,在访问8bpp位图时更改每个值会导致一些随机的rgb颜色,即使PixelFormat仍为8bpp。 我目前正在开发c#,算法如下: (C#) 1-将原始位图加载到8bpp 2-创建具有8bpp的空温度位图,其大小与原始尺寸相同 两个位图的3-LockBits,使用P / Invoke调用c ++方法,我传递每个BitmapData对象的Scan0。 (我使用了c ++方法,因为它在迭代Bitmap的像素时提供了更好的性能) (C ++) 4-根据一些参数创建一个int [256]调色板,并通过将原始像素值传递到调色板来编辑临时位图字节。 (C#) 5- UnlockBits。 我的问题是如何在没有奇怪的rgb颜色的情况下编辑像素值,甚至更好地编辑8bpp位图的颜色表?

如何将Bitmap保存为图标?

我需要保存从图像文件(.png,.jpeg,.bmp)加载的Bitmap对象,并将其作为图标(.ico)保存到单独的文件中。 首先,我尝试使用Icon ImageFormat将Bitmap对象保存到文件中: using System.Drawing; Bitmap bmp = (Bitmap)pictureBox1.Image; bmp.Save(@”C:\icon.ico”, Imaging.ImageFormat.Icon); 这个失败了,因为生成的图标格式不正确,不能用作图标。 接下来是从Bitmap获取HIcon并将其保存到文件中: using System.Drawing; using System.IO; StreamWriter iconWriter = new StreamWriter(@”C:\icon.ico”); Icon ico = Icon.FromHandle(((Bitmap)pictureBox1.Image).GetHicon()) ico.Save(iconWriter.BaseStream); iconWriter.Close(); iconWriter.Dispose(); 这个也不起作用。 尽管图标文件已正确写入,但它只有16种颜色且宽度和高度有限。 我希望能够编写具有自定义宽度和高度的图标,以保留原始图像的颜色。 这有可能在.NET中实现吗? 提前致谢。

将图像保存为位图而不会降低质量

我遇到了打印质量问题,我在此链接中对其进行了描述:在此处输入链接说明 我尝试了许多不同的解决方案,帮助其他类似概率的人,但他们不适合我,因为我有一个新的概率将图像保存为位图(低质量) 最后我决定问我当前的问题,因为正如你在上面的链接中看到的,我的问题在保存系统(96dpi)中的图像并恢复之后开始。 但我没有办法,所以我正在寻找一种方法,可以保存图像(具有从图形中绘制的像素),而不会降低质量。 提前

处理大型位图(最高3GB)

我正在做一些大学项目并且遇到内存问题。 我在硬盘上加载一个大约1,5GB的位图,代码如下: Bitmap bmp = new Bitmap(pathToFile); 问题是新创建的Bitmap对象使用大约3,5GB的RAM,这是我无法理解的(这真的是大包装:E)。 我需要到像素数组,并且使用Bitmap类非常有用(我稍后使用LockBits()方法,并且每个字节处理数组字节)但在这种情况下它是完全阻塞。 所以这是我的问题: 是否有任何简单的方法来提取像素arrays而不需要额外的2gb? 我正在使用c#来提取所需的数组,后来用c ++处理 – 也许我可以用c ++提取所有需要的数据(但转换问题出现在这里 – 我专注于24bgr格式)? PS:我需要将整个位图保留在内存中,因此将其拆分为部分并不是解决方案。 PS2:只是澄清一些问题:我知道文件扩展名和文件格式之间的区别。 加载的文件是未压缩的位图,每个像素大小为3个字节~1.42GB(16k x 32k像素),那么为什么Bitmap对象的大两倍多呢? 任何解压缩问题和转换为其他格式都没有发生。

在C#中使用原生HBitmap,同时保留alpha通道/透明度

假设我从本机Windows函数中获取HBITMAP对象/句柄。 我可以使用Bitmap.FromHbitmap(nativeHBitmap)将其转换为托管位图,但如果原生图像具有透明度信息(alpha通道),则此转换会丢失它。 有关此问题的Stack Overflow有几个问题。 使用来自这个问题的第一个答案的信息( 如何使用GDI +绘制ARGB位图? ),我写了一段代码,我尝试过并且有效。 它基本上使用GetObject和BITMAP结构获取本机HBitmap宽度,高度和指向像素数据位置的指针,然后调用托管Bitmap构造函数: Bitmap managedBitmap = new Bitmap(bitmapStruct.bmWidth, bitmapStruct.bmHeight, bitmapStruct.bmWidth * 4, PixelFormat.Format32bppArgb, bitmapStruct.bmBits); 据我所知(如果我错了,请纠正我),这不会将实际像素数据从原生HBitmap复制到托管位图,它只是将托管位图指向来自原生HBitmap的像素数据。 我不会在另一个图形(DC)或另一个位图上绘制位图,以避免不必要的内存复制,尤其是对于大位图。 我可以简单地将此位图分配给PictureBox控件或Form BackgroundImage属性。 它工作正常,使用透明度正确显示位图。 当我不再使用位图时,我确保BackgroundImage属性不再指向位图,并且我同时配置了托管位图和本机HBitmap。 问题:你能告诉我这个推理和代码是否正确。 我希望我不会得到一些意想不到的行为或错误。 我希望我能正确释放所有内存和对象。 private void Example() { IntPtr nativeHBitmap = IntPtr.Zero; /* Get the native HBitmap object from a Windows function here */ // Create the BITMAP structure and […]

调整位图图像的大小

我希望保存较小的图像尺寸。 我该如何resize? 我使用此代码来重新映射图像: 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.Default); renderBitmap.Render(surface); BmpBitmapEncoder encoder = new BmpBitmapEncoder(); // push the rendered bitmap to it encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); // save the data to the stream encoder.Save(outStream);