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
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM] ElementHost 클래스 : PropertyMap 속성을 사용해 WPF 엘리먼트 속성 매핑 설정하기 (0) | 2023.01.01 |
---|---|
[C#/WINFORM] ElementHost 클래스 : WPF 복합 컨트롤 호스트하기 (0) | 2023.01.01 |
[C#/WINFORM] ElementHost 클래스 : WPF 복합 컨트롤 사용하기 (0) | 2023.01.01 |
[C#/WINFORM] RNGCryptoServiceProvider 클래스 : GetBytes 메소드를 사용해 임시 패스워드 생성기 만들기 (0) | 2022.11.05 |
[C#/WINFORM/.NET6] 마우스 이벤트 발생시키기 (0) | 2022.10.22 |
[C#/WINFORM/.NET6] Point 구조체 : 선의 왼쪽 포인트 여부 구하기 (0) | 2022.10.19 |
[C#/WINFORM/.NET6] 별점(Star Rating) 그리기 (0) | 2022.10.14 |
[C#/WINFORM/.NET6] 비주얼 스튜디오 2022에서 단일 실행 파일 배포하기 (0) | 2022.10.10 |
[C#/WINFORM/.NET6] ISynchronizeInvoke 인터페이스 : InvokeRequired 코드 패턴 자동화하기 (0) | 2022.10.09 |
[C#/WINFORM/.NET6] MethodInvoker 대리자 : InvokeRequired 코드 패턴 자동화하기 (0) | 2022.10.09 |
댓글을 달아 주세요