我正在尝试将pdf文件转换为图片。 ImageMagick是一个很棒的工具,使用命令行工具可以获得理想的结果。
但我需要在我的代码中执行此操作, 所以添加了对http://imagemagick.codeplex.com/的引用 以下代码示例将pdf的每个页面呈现为图像:
MagickNet.InitializeMagick();
using (ImageList im = new ImageList())
{
im.ReadImages(@"E:\Test\" + fileName + ".pdf");
int count = 0;
foreach (Image image in im)
{
image.Quality = 100;
image.CompressType = mageMagickNET.CompressionType.LosslessJPEGCompression;
image.Write(@"E:\Test\" + fileName + "-" + count.ToString() + ".jpg");
++count;
}
}
问题:IT看起来像CRAP 渲染的图像几乎不可读。 我意识到的问题是它使用ImageMagick的默认72 DPI。 并且我找不到通过.Net包装器设置它的方法(96dpi或120dpi给出好的结果)。
我错过了什么,或者真的没有办法通过这个包装器设置它?
由于
答案 0 :(得分:1)
我对此进行了简要介绍。
Image.Resolution
属性可用于设置PDF呈现分辨率,但ImageMagick.NET包装器不会公开该属性。
将缺少的属性添加到Image类非常简单。
Index: ImageMagickNET/Image.h
===================================================================
--- ImageMagickNET/Image.h (revision 59374)
+++ ImageMagickNET/Image.h (working copy)
@@ -532,6 +532,13 @@
}
+ // Vertical and horizontal resolution in pixels of the image.
+ property Geometry^ Density
+ {
+ void set(Geometry^);
+ }
+
+
//----------------------------------------------------------------
// IO
//----------------------------------------------------------------
Index: ImageMagickNET/Image.cpp
===================================================================
--- ImageMagickNET/Image.cpp (revision 59374)
+++ ImageMagickNET/Image.cpp (working copy)
@@ -1099,5 +1099,9 @@
return bitmap;
}
+ void Image::Density::set(Geometry^ density_)
+ {
+ image->density(*(density_->geometry));
+ }
}
不幸的是,a bug似乎阻止我们在您尝试进行迭代浏览PDF页面时设置渲染质量。
另一个选择是分别打开每个页面:
Image image = new Image();
image.Density = new Geometry("1000"); // 1000 dpi
image.Read(@"C:\u\test.pdf[2]"); // Open the 3rd page, index 0 is the first
如果页码超出范围,则会出现原始 C ++异常。虽然you can catch it in C#包装器可能包含用于表示ImageMagick错误的 .NET 异常类。
答案 1 :(得分:0)
在阅读前在MagickReadSettings中设置密度。
MagickImage image = new MagickImage();
MagickReadSettings settings = new MagickReadSettings();
settings.Density = new Density(1000);
image.Read(file,settings);
答案 2 :(得分:0)
更新参考资料,我在ImageMagick官方网站上建立了.NET包装器。