4

複数の画像をマルチ TIFF 画像ファイルに変換しようとしています。以下のコードを複数の画像で実行すると、「GDI+ で一般的なエラーが発生しました」というメッセージが表示されます。エラー。画像が 1 つしかない場合は、正常に動作し、ファイルを出力します。コードをビットマップに変更し、リストをビットマップに変更すると、コードは複数の画像で正常に機能します。

public List<Metafile> metaFileList = new List<Metafile>();

private void writeImagesToEnhancedMetaMulTiff()
{
        ImageCodecInfo info = null;
        foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders())
            if (ice.MimeType == "image/tiff")
                info = ice;

        System.Drawing.Imaging.Encoder enc = System.Drawing.Imaging.Encoder.SaveFlag;

        EncoderParameters ep = new EncoderParameters(1);
        ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
        Metafile pages = null;

        int frames = 0;

        foreach (Metafile metaFileItem in metaFileList)
        {
            if (frames == 0)
            {
                pages = metaFileItem;
                pages.Save(@"E:\output_MetaFile.tif", info, ep);
            }
            else
            {
                ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);
                pages.SaveAdd(metaFileItem, ep);
            }
            if (frames >= metaFileList.Count() - 1)
            {
                ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush);
            }
            frames++;
        }
    }

クリップボードをメタファイルとして取得するには、次のコードを使用しています。

    public System.Drawing.Imaging.Metafile GetEnhMetafileOnClipboard(IntPtr hWnd)
    {
        System.Drawing.Imaging.Metafile meta = null;
        if(OpenClipboard(hWnd))
        {
            try
            {
                if (IsClipboardFormatAvailable(CF_ENHMETAFILE) != 0)
                {
                    IntPtr hmeta = GetClipboardData(CF_ENHMETAFILE);
                    meta = new System.Drawing.Imaging.Metafile(hmeta, true);
                    metaFileList.Add(meta);
                }
            }
            finally
            {
                CloseClipboard();
            }
        }
        return meta;
    }

さらにコードを提供する必要がある場合はお知らせください。

ありがとう。

4

1 に答える 1

0

ラスタライズしたいときは、Metafile の Save メソッドの使用を常に避けてきました。代わりに、ビットマップに描画し、ビットマップを変換して保存します。

何かのようなもの:

                    GraphicsUnit uPix = GraphicsUnit.Pixel;

                    RectangleF bounds = meta.GetBounds(ref uPix);
                    Bitmap dstBitmap = new Bitmap((int)bounds.Width, (int)bounds.Height, PixelFormat.Format32bppArgb);


                    Graphics g = Graphics.FromImage(dstBitmap);
                    g.Clear(Color.White);
                    g.DrawImage(meta, dstBitmap.GetBounds(ref uPix), meta.GetBounds(ref uPix), uPix);

                    dstBitmap.Save(@"E:\output_MetaFile.tif",info,ep);

メタファイルの場合、クリップボードからデータをコピーすることが非常に重要であるため、クリップボードからメタファイルを取得する場合、通常は次のコードを使用します。

if(iData.GetDataPresent(DataFormats.EnhancedMetafile))
        {

            // Get the meta data from the clipboard
            IntPtr hwnd = this.Handle;
            if(OpenClipboard(hwnd) == false) return false;
            IntPtr hToTempPastedEmf = GetClipboardData(14); //CF_ENHMETAFILE=14

            // Get the size of the meta data
            int iSize = GetEnhMetaFileBits(hToTempPastedEmf,0,IntPtr.Zero);                             
            // Copy the meta file from the clipboard (MUST remove all references to the clipboard)
            IntPtr hToPastedEmf = CopyEnhMetaFile(hToTempPastedEmf, new IntPtr(0));
            Metafile meta = new Metafile(hToPastedEmf,false); 

            CloseClipboard();

        }
于 2013-08-16T05:45:20.897 に答える