첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ Image 객체에서 이미지의 RTF를 구하는 방법을 보여준다.

 

▶ 예제 코드 (C#)

using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Text;

#region 이미지 RTF 구하기 - GetImageRTF(image)

/// <summary>
/// 이미지 RTF 구하기
/// </summary>
/// <param name="image">이미지</param>
/// <returns>이미지 RTF</returns>
public string GetImageRTF(Image image)
{
    const int MM_ISOTROPIC   = 7; // 메타 파일이 1:1 종횡비를 유지하는지 확인한다.
    const int MM_ANISOTROPIC = 8; // 메타 파일의 X 좌표와 Y 좌표를 독립적으로 조정할 수 있습니다.

    int mappingMode = MM_ANISOTROPIC;

    MemoryStream stream   = null;
    Graphics     graphics = null;
    Metafile     metaFile = null;
    IntPtr       deviceContextHandle;

    try
    {
        StringBuilder stringBuilder = new StringBuilder();

        stream = new MemoryStream();

        using(graphics = Graphics.FromHwnd(new IntPtr(0)))
        {
            deviceContextHandle = graphics.GetHdc();

            metaFile = new Metafile(stream, deviceContextHandle);

            graphics.ReleaseHdc(deviceContextHandle);
        }

        using(graphics = Graphics.FromImage(metaFile))
        {
            graphics.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
        }

        IntPtr emfHandle = metaFile.GetHenhmetafile();

        uint bufferSize = GdipEmfToWmfBits(emfHandle, 0, null, mappingMode, EMFToWMFBitsFlag.Default);

        byte[] bufferByteArray = new byte[bufferSize];

        GdipEmfToWmfBits(emfHandle, bufferSize, bufferByteArray, mappingMode, EMFToWMFBitsFlag.Default);

        for(int i = 0; i < bufferByteArray.Length; ++i)
        {
            stringBuilder.Append(string.Format("{0:X2}", bufferByteArray[i]));
        }

        return stringBuilder.ToString();
    }
    finally
    {
        if(graphics != null)
        {
            graphics.Dispose();
        }

        if(metaFile != null)
        {
            metaFile.Dispose();
        }

        if(stream != null)
        {
            stream.Close();
        }
    }
}

#endregion

/// <summary>
/// EMF→WMF 비트 플래그
/// </summary>
public enum EMFToWMFBitsFlag
{
    /// <summary>
    /// Default
    /// </summary>
    Default = 0x00000000,

    /// <summary>
    /// Embed EMF
    /// </summary>
    EmbedEMF = 0x00000001,

    /// <summary>
    /// Include Placeable
    /// </summary>
    IncludePlaceable = 0x00000002,

    /// <summary>
    /// No XOR Clip
    /// </summary>
    NoXORClip = 0x00000004
};

#region GDI+ EMF→WMF 변환하기 - GdipEmfToWmfBits(emfHandle, bufferSize, bufferByteArray, mappingMode, flag)

/// <summary>
/// GDI+ EMF→WMF 변환하기
/// </summary>
/// <param name="emfHandle">EMF 핸들</param>
/// <param name="bufferSize">버퍼 크기</param>
/// <param name="bufferByteArray">버퍼 바이트 배열</param>
/// <param name="mappingMode">매핑 모드</param>
/// <param name="flag">플래그</param>
/// <returns>처리 결과</returns>
[DllImport("gdiplus")]
private static extern uint GdipEmfToWmfBits(IntPtr emfHandle, uint bufferSize, byte[] bufferByteArray, int mappingMode, EMFToWMFBitsFlag flag);

#endregion
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요