Tag: png

C#中的PNG图像问题

在Visual Studio 2008中工作。我正在尝试绘制PNG图像并再次保存该图像。 我做了以下事情: private Image img = Image.FromFile(“file.png”); private Graphics newGraphics; 在构造函数中: newGraphics = Graphics.FromImage(img); 构建解决方案不会产生错误。 当我尝试运行它时,我得到了这个: 无法从具有索引像素格式的图像创建Graphics对象。 我在C#中使用图像的经验不多。 这是什么意思,我该如何解决这个问题? 编辑:通过调试,Visual Studio告诉我该图像具有format8bppindexed Pixel Format。 所以如果我不能使用Graphics类,我该怎么用? EDIT2:读完之后,我认为可以安全地假设我在使用GDI +时更好地坚持使用JPG文件,不是吗? EDIT3:我的使用陈述: using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;

如何在文件的一部分上使用DeflateStream?

我正在研究另一个问题的解决方案,即读取PNG的’zTXt’块中的数据。 我就是在文件中找到块,并阅读zTXt的关键字。 我在阅读zTXt的压缩部分时遇到问题。 我之前从未使用过DeflateStream对象,并且遇到了一些麻烦。 在读取时,似乎期望长度参数为“未压缩”字节。 但就我而言,我只知道“压缩”字节中数据的长度。 为了解决这个问题,我将需要解压缩的所有数据放入MemoryStream中,然后使用DeflateStream“读取结束”。 现在这只是peachy,除了它抛出一个InvalidDataException,并显示消息“块长度与其补码不匹配”。 现在我不知道这意味着什么。 怎么可能出错? 块的格式是4个字节用于ID(“zTXt”),一个大端32位int用于数据长度,数据,最后是CRC32校验和,我现在忽略它。 zTXt块的格式首先是以null结尾(字符串作为关键字),然后是压缩方法的一个字节(总是0,DEFLATE方法),其余数据是压缩文本。 我的方法接受一个新的FileStream,并返回一个包含zTXt关键字和数据的字典。 这是现在的怪物: public static List<KeyValuePair> GetZtxt(FileStream stream) { var ret = new List<KeyValuePair>(); try { stream.Position = 0; var br = new BinaryReader(stream, Encoding.ASCII); var head = br.ReadBytes(8); // The header is the same for all PNGs. if (!head.SequenceEqual(new byte[] { 0x89, 0x50, […]

适用于.NET的最快PNG解码器

在将结果发送到Web客户端之前,我们的Web服务器需要将大量图像组合在一起。 此过程对性能至关重要,因为服务器每小时可以接收数千个请求。 现在我们的解决方案从HD加载PNG文件(每个大约1MB)并将它们发送到video卡,以便在GPU上完成合成。 我们首先尝试使用XNA API公开的PNG解码器加载我们的图像。 我们看到表现不太好。 要了解问题是从HD加载还是解码PNG,我们通过在内存流中加载文件,然后将该内存流发送到.NET PNG解码器来修改它。 使用XNA或使用System.Windows.Media.Imaging.PngBitmapDecoder类的性能差异并不重要。 我们大致得到了相同的性能水平。 我们的基准测试显示以下性能结果: 从磁盘加载图像:37.76ms 1% 解码PNG:2816.97ms 77% 在video硬件上加载图像:196.67ms 5% 成分:87.80ms 2% 从video硬件获取作曲结果:166.21ms 5% 编码为PNG:318.13ms 9% 存储到磁盘:3.96ms 0% 清理:53.00ms 1% 总计:3680.50ms 100% 从这些结果中我们看到最慢的部分是解码PNG时。 所以我们想知道是否会有我们可以使用的PNG解码器,这将允许我们减少PNG解码时间。 我们还考虑将图像保持在硬盘上不压缩,但是每个图像的大小为10MB而不是1MB,并且由于硬盘上存储了数万个这样的图像,因此无法存储它们。压缩。 编辑:更有用的信息: 基准测试模拟加载20个PNG图像并将它们合成在一起。 这大致对应于我们将在生产环境中获得的请求类型。 组合物中使用的每个图像的尺寸为1600×1600。 该解决方案将涉及多达10个负载均衡的服务器,就像我们在这里讨论的那样。 因此额外的软件开发工作可能值得节省硬件成本。 我们正在考虑缓存解码的源图像,但每种组合很可能使用完全不同的源图像完成,因此缓存未命中率高,性能提升低。 基准测试是用一个糟糕的video卡完成的,所以我们可以期待使用体面的video卡将PNG解码更加成为性能瓶颈。

如何将透明PNG加载到位图并忽略Alpha通道

我看到很多关于如何加载带有alpha通道的PNG并显示它的问题,但没有关于如何加载具有alpha通道但忽略alpha通道的PNG,揭示底层RGB数据。 我试过简单地删除alpha通道中的所有数据,但我只是得到黑色像素而不是我想要的颜色数据。 从我创建Bitmap对象的那一刻起,它似乎不包含alpha为0的像素中的任何颜色信息,尽管我向你保证PNG中的信息实际存在。 要清楚,如果我的图像包含具有这些值的像素:(R:255 G:128 B:128 A:0)我需要该像素(R:255 G:128 B:128 A:255),而不是(R:0 G:0 B:0 A:255)。 谢谢 编辑:以前的信息不正确。 位图包含使用时的所有信息: Bitmap myImage = Bitmap(“filename.png”) ; 我做错了是后来使用: Bitmap otherImage = Bitmap(myImage); 似乎这就是我需要的数据无效。 相反,我现在正在使用 Bitmap otherImage = (Bitmap)(myImage.Clone()); 然后使用lockbits手动将alpha通道设置为不透明。 我希望这对未来的某些人有用。

Bitmap.Save保存图标实际上可以保存.png

我需要编写一个程序,根据tileset图像生成108个图标组合(标准窗口.ico文件)。 我使用System.Drawing.Bitmap类来构建每个组合,我将它们保存为: Bitmap IconBitmap = new Bitmap(16, 16); // Some processing, writing different parts of the source tileset // … IconBitmap.Save(Path.Combine(TargetPath, “Icon” + Counter + “.ico”), ImageFormat.Icon); 但我发现保存的文件实际上是PNG。 Windows资源管理器和Visual Studio都无法正确显示它,但GIMP可以,如果我在Hex查看器中打开它,这就是我所看到的: 00000000 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 ‰PNG……..IHDR 00000010 00 00 00 10 00 00 […]

将DOC / DOCX转换为PNG

我正在尝试创建一个将doc / docx转换为png格式的Web服务。 我似乎遇到的问题是我找不到任何可以满足我需要的库或其他东西,考虑到我正在寻找免费的东西而不依赖于Office(应用程序将运行的服务器没有安装Office) )。 有什么能帮助我获得这个吗? 或者我必须在使用办公室依赖的东西之间做出选择(比如Interop – 我读的哪个在服务器上使用真的很糟糕)或者不是免费的东西? 谢谢

在C / C中将.PNG转换为.ICO#

我想将.PNG文件转换为.ICO文件。 我想在本地做任何互联网依赖(所以我不能使用像converttoico.com等在线工具)。 我发现了一个名为png2ico的奇妙工具,但它有一个限制,它只能将大小为1X1的图像转换为256X256。 虽然目前我正在修改PNG分辨率(在C#中)并将其压缩到256X256,然后使用此工具将其转换为图标,但图像质量并不好。 有没有人知道任何本地图书馆这样做或任何可以帮助我的工具(免费或付费)? 谢谢。

为什么调整png图像的大小会失去透明度?

我正在尝试按如下方式调整图像大小。 我将resize的图像返回到byte[]以便我可以将其存储在数据库中。 png图像的透明度丢失了。 请帮助改善这一点。 private byte[] GetThumbNail(string imageFile, Stream imageStream, int imageLen) { try { Image.GetThumbnailImageAbort imageCallBack = new Image.GetThumbnailImageAbort(ThumbnailCallback); Bitmap getBitmap = new Bitmap(imageFile); byte[] returnByte = new byte[imageLen]; Image getThumbnail = getBitmap.GetThumbnailImage(160, 59, imageCallBack, IntPtr.Zero); using (Graphics g = Graphics.FromImage(getThumbnail)) { g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.DrawImage(getThumbnail, 0, 0, 160, 59); } […]

将canvas保存到png C#wpf

所以我试图在WPF C#中拍摄我的canvas快照,以便我可以将其保存为png。 目前图像保存不正确,因为它包括左边距和上边距。 这就是我所拥有的: 为canvas大小创建一个矩形。 如果canvas.Margin.Left和Top设置为0,则保存的图像大小正确但仍然会发生偏移,从而切割底边和右边。 设置Margin.Left和Top仍会导致偏移发生,但整个图像被保存但尺寸错误(margin.Left + ActualWidth)而不仅仅是ActualWidth Rect rect = new Rect(canvas.Margin.Left, canvas.Margin.Top, canvas.ActualWidth, canvas.ActualHeight); double dpi = 96d; RenderTargetBitmap rtb = new RenderTargetBitmap((int)rect.Right, (int)rect.Bottom, dpi, dpi, System.Windows.Media.PixelFormats.Default); rtb.Render(canvas); BitmapEncoder pngEncoder = new PngBitmapEncoder(); pngEncoder.Frames.Add(BitmapFrame.Create(rtb)); try { System.IO.MemoryStream ms = new System.IO.MemoryStream(); pngEncoder.Save(ms); ms.Close(); System.IO.File.WriteAllBytes(filename, ms.ToArray()); } catch (Exception err) { MessageBox.Show(err.ToString(), “Error”, […]

.net中的PNG压缩

我想将位图压缩为具有不同压缩级别的PNG,因为这些级别在C#中的JPEG压缩中可用。 我有20到30张不同尺寸的图像,可在1秒内处理。 是否有任何库可以在不同压缩级别的PNG中实现此压缩?