我在读取word中的图片时,发现读取到的图片与实际的图片大小不一样,相对偏大,但是好像没有规律。求高手赐教,以增长知识!
你是不是这样测试的:
1、选取一张 400 X 600 的图片插入到 Word 文档;
2、设置插入的图片的格式,缩小 10%;
3、用 Asp.Net 读取 Work 中刚插入的图片;
4、获取读取出的图片的大小属性:360 X 540;
word是人家下了给我的,具体是怎么设的不清楚,但我自己画了张400*600大小的图片,读出来变到2200多*2000多像素。每张图片都变大的,但是放大的没规律
@张小瑜: 你有用 Windows 照片查看器看下你读出来的 2200 * 2000 的图片是什么样子吗?
@Launcher:看了,正常是正常的,等比放大了
@张小瑜: 把读取的代码贴出来。
@Launcher: foreach (Paragraph item in doc.Paragraphs)
{
if (item != null)
{
if (item.Range.Text.Trim() != "")
{
//判断该范围内是否存在图片
if (item.Range.InlineShapes.Count != 0)
{
foreach (InlineShape shape in item.Range.InlineShapes)
{
//判断类型
if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
{
byte[] img = (byte[])shape.Range.EnhMetaFileBits;
Bitmap bmp = new Bitmap(new MemoryStream(img));
fileName = DateTime.Now.ToString("yyyyMMdd") + "_" + Guid.NewGuid() + ".png";
bmp.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png);
if (i++ == 0)
{
pic = getPicInfo(sid, fileName, 1);
pic.Height = bmp.Height;
pic.Width = bmp.Width;
wordList.Add(pic);
@张小瑜: 你插入图片后,是不是把图片放大了啊?
@Launcher:没有啊,他自己变大的啊
@张小瑜: 用这个 shape.Range.CopyAsPicture() ,然后从剪贴板中粘贴。EnhMetaFileBits 是增强的图元格式。
@Launcher: 能代码全一点吗?谢谢!
@张小瑜: shape.Range.CopyAsPicture();
Image image = Clipboard.GetImage();
image.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png);
@Launcher: 不好意思,有点愚笨,那上面那个 shape.Range.CopyAsPicture();从哪里得出来?
@张小瑜:
//判断类型
if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
{
shape.Range.CopyAsPicture();
@Launcher: 这方法还是有问题, Image image = Clipboard.GetImage();取的时候是空值。
@张小瑜:
shape.Select(); 或者 shape.Range.Select(); /// 哪个能编译过就用哪个
shape.Range.CopyAsPicture();
Image image = Clipboard.GetImage();
image.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png);
@Launcher: 写一起也是空值
@张小瑜: 二个都能编译,都结果都是空
@张小瑜: 把你的完整代码贴出来。
if (item.Range.InlineShapes.Count != 0) { foreach (InlineShape shape in item.Range.InlineShapes) { //判断类型 if (shape.Type == WdInlineShapeType.wdInlineShapePicture) { //byte[] img = (byte[])shape.Range.EnhMetaFileBits; //Bitmap bmp = new Bitmap(new MemoryStream(img)); shape.Range.Select(); shape.Range.CopyAsPicture(); Image bmp = Clipboard.GetImage(); fileName = DateTime.Now.ToString("yyyyMMdd") + "_" + Guid.NewGuid() + ".png"; bmp.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png); if (i++ == 0) { pic = getPicInfo(sid, fileName, 1); pic.Height = bmp.Height; pic.Width = bmp.Width; wordList.Add(pic); pic = getPicInfo(sid, fileName, 2); pic.Height = bmp.Height; pic.Width = bmp.Width; pic.PicFirst = "人"; pic.PicSec = "图片"; wordList.Add(pic); } else { pic = getPicInfo(sid, fileName, 2); pic.Height = bmp.Height; pic.Width = bmp.Width; pic.PicFirst = "人"; pic.PicSec = "图片"; wordList.Add(pic); } } }
@张小瑜:
@张小瑜: 你这代码没啥问题,你把这段代码放到 Winform 或 Console 程序中去看下效果。问题出在 Asp.Net 无法使用 Clipboard。
@Launcher: 好!
@张小瑜: 那我这个是不是没办法改了?
@张小瑜: Clipboard 要求线程单元模型为 STA,我还是给你贴代码吧!
Thread staThread = new Thread(new ThreadStart(myMethod));
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
public static void myMethod()
{
// 从 Word 文档中读取图片的代码
}
@Launcher:还记得上次读word取图片的问题吗?现在全解决了,不过到最后发布程序时,导入那个word时一直报内存不足,这个问题有遇到过吗?
@张小瑜: 是不是真的内存不够了?看一下进程列表是不是有多个 word.exe 存在?
@Launcher: 应该不是内存不够。进程里就一个winword.exe.然后我在开发工具里编号执行是完成没有问题的。不知道是代码里还是配置有问题
@张小瑜: 只保留打开关闭文档的功能测试下。
请教一下为什么取到了图片,但是图片生成后就是一个红叉了