从excel复制图片到剪贴板 - >程序中的输出 - >得到平滑的图片。哪里失败了?

时间:2013-11-16 16:58:40

标签: c++ image excel vba ole

美好的一天!如果你很懒,你可以尝试只读突出显示的字样:)

源文件.doc和.xls

我的文字 colors.doc 。它包含一个图片325x125 ,扩展名为png,显示全尺寸的44%缩放。 我复制( Ctrl + C )此图片并粘贴( Ctrl + V car.xls 。图片粘贴44%变焦,我将其设置为100%。然后我关闭并保存这两个文件。

该计划:

我有一个程序,其中打开colors.doc并将图片复制到剪贴板

  Shapes.Item(1).Select
  Selection.CopyAsPicture

程序 从剪贴板获取,如 EnhMetaFile (HENHMETAFILE)。当我播放该图元文件时,我得到一张好照片而没有平滑。程序存储图片关闭colors.doc 。然后打开car.xls并使用:

将图片复制到剪贴板
  

Shapes.Item(1).CopyPicture(xlSreen,xlPicture)//默认参数

我的程序再次,就像 EnhMetaFile (HENHMETAFILE)一样。但是当我播放图元文件时,我得到平滑的图片407x156

为什么会这样?我怎么能避免这个?请帮助,我已经2天不能确定这个麻烦了。

我的一些观察结果:

如果我从 car.xls 复制(Ctrl + C)图片并将其粘贴(Ctrl + V)到任何图形编辑器,我会得到一张好照片!!

鳕鱼:

如果你不害怕WINAPI和Ole请看下一个代码:

Picture::InitFromBuffer(){
    OpenClipboard(DebHDlg);
    HENHMETAFILE emfp = (HENHMETAFILE)GetClipboardData(CF_ENHMETAFILE);
    memset(&head, 0, sizeof(ENHMETAHEADER));
    head.nSize = sizeof(ENHMETAHEADER);
    GetEnhMetaFileHeader(emfp, sizeof(ENHMETAHEADER), &head);
    data = new BYTE[head.nBytes];
    GetEnhMetaFileBits(emfp, sizeof(BYTE)*(head.nBytes), data);
    CloseClipboard();
}

Picture::Display(HWND hDlg){
    if (hDlg != NULL){
        HDC hDC = GetDC(DebHDlg);
        int er;
        RECT r;
        HENHMETAFILE emfp = SetEnhMetaFileBits(this->head.nBytes, this->data);
        GetClientRect(DebHDlg, &r);
        if (!PlayEnhMetaFile(hDC, emfp, &r))
            er = GetLastError();
        ReleaseDC(hDlg, hDC);
        }
    }

struct Picture{
    ENHMETAHEADER head;
    BYTE *data;
    ...
};

我直接在主窗口上显示它以便快速调试:)
左图很好。正确的图片是平滑的。

enter image description here

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但使用Shapes.Item(1).Copy(...)代替CopyPicture解决了这个问题。