在 C# 中将双色 TIFF 转换为双色 PNG
我需要将黑白(黑白)TIFF 文件转换为另一种格式以便通过网络浏览器显示,目前我们使用的是 JPG,但格式并不重要。从阅读周围的内容来看,.NET 似乎并不容易支持编写双色调图像,因此我们最终得到的文件大约为 1MB,而不是大约 100K。我正在考虑使用 ImageMagick 来执行此操作,但理想情况下我想要一个如果可能的话不需要此操作的解决方案。
当前代码片段(它还对图像进行了一些调整大小):
using (Image img = Image.FromFile(imageName))
{
using (Bitmap resized = new Bitmap(resizedWidth, resizedHeight)
{
using (Graphics g = Graphics.FromImage(resized))
{
g.DrawImage(img, new Rectangle(0, 0, resized.Width, resized.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
}
resized.Save(outputFilename, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
有什么方法可以实现这一点吗?
谢谢。
I need to convert bitonal (black and white) TIFF files into another format for display by a web browser, currently we're using JPGs, but the format isn't crucial. From reading around .NET doesn't seem to easily support writing bitonal images, so we're ending up with ~1MB files instead of ~100K ones. I'm considering using ImageMagick to do this, but ideally i'd like a solution which doesn't require this if possible.
Current code snippet (which also does some resizing on the image):
using (Image img = Image.FromFile(imageName))
{
using (Bitmap resized = new Bitmap(resizedWidth, resizedHeight)
{
using (Graphics g = Graphics.FromImage(resized))
{
g.DrawImage(img, new Rectangle(0, 0, resized.Width, resized.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
}
resized.Save(outputFilename, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
Is there any way to achieve this?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我相信通过检查
resized
位图是否为PixelFormat.Format1bppIndexed
可以解决该问题。如果不是,您应该将其转换为 1bpp 位图,然后您可以将其保存为黑白 png,没有问题。换句话说,您应该使用以下代码而不是
resized.Save(outputFilename, System.Drawing.Imaging.ImageFormat.Jpeg);
我对
convertToBitonal
使用以下代码:I believe the problem can be solved by checking that
resized
bitmap is ofPixelFormat.Format1bppIndexed
. If it's not, you should convert it to 1bpp bitmap and after that you can save it as black and white png without problems.In other words, you should use following code instead of
resized.Save(outputFilename, System.Drawing.Imaging.ImageFormat.Jpeg);
I use following code for
convertToBitonal
:您是否尝试过使用 Image.Save 重载进行保存 编码器参数?
就像 Encoder.ColorDepth 参数 ?
Have you tried saving using the Image.Save overload with Encoder parameters?
Like the Encoder.ColorDepth Parameter?
尝试 jaroslav 对颜色深度的建议不起作用:
jpeg 仍然是全色 jpeg。
我认为 gdi plus 不支持灰度 jpeg。您是否尝试过查看 Windows 映像组件?
http://www.microsoft.com/downloads/details.aspx microsoft.com/downloads/details.aspx?FamilyID=8e011506-6307-445b-b950-215def45ddd8&displaylang=en
代码示例:http://www.codeproject.com/KB/GDI-plus/windows_imaging.aspx
维基百科:http://en.wikipedia.org/wiki/Windows_Imaging_Component
Trying jaroslav's suggestion for color depth doesn't work:
The jpeg is still a full color jpeg.
I don't think there is any support for grayscale jpeg in gdi plus. Have you tried looking in windows imaging component?
http://www.microsoft.com/downloads/details.aspx?FamilyID=8e011506-6307-445b-b950-215def45ddd8&displaylang=en
code example: http://www.codeproject.com/KB/GDI-plus/windows_imaging.aspx
wikipedia: http://en.wikipedia.org/wiki/Windows_Imaging_Component
这是一个旧线程。不过,我还是要加 2 美分。
我使用 AForge.Net 库(开源)
使用这些 dll。
Aforge.dll
、AForge.Imaging.dll
This is an old thread. However, I'll add my 2 cents.
I use AForge.Net libraries (open source)
use these dlls.
Aforge.dll
,AForge.Imaging.dll
您尝试过 1 位颜色深度的 PNG 吗?要获得类似于 CCITT4 TIFF 的大小,我相信您的图像需要使用 1 位索引调色板。
但是,您不能使用 .NET 中的 Graphics 对象在索引图像上绘图。
您可能必须使用 LockBits 来操作每个像素。
请参阅 鲍勃·鲍威尔的精彩文章。
Have you tried PNG with 1 bit color depth?To achieve a size similar to a CCITT4 TIFF, I believe your image needs to use a 1-bit indexed pallette.
However, you can't use the Graphics object in .NET to draw on an indexed image.
You will probably have to use LockBits to manipulate each pixel.
See Bob Powell's excellent article.