2008-11-11 4 views
1

48x48 및 256x256 Vista PNG 버전 (32x32 및 16x16 버전 포함)이 포함 된 ico 파일이 있습니다. 적절한 내부 크기 버전을 사용하여 아이콘을 그립니다.WinForms .NET 2.0 : 적절한 크기의 아이콘을 페인트하는 방법?

Icon ico = Properties.Resources.TestIcon; 
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 48, 48)); 
e.Graphics.DrawIcon(ico, new Rectangle(48, 0, 256, 256)); 

그러나 그들은 각각 경우 48x48과 256 × 256까지 불어 32 × 32 버전을 그릴 :

은 내가 시도했습니다.

Icon ico = Properties.Resources.TestIcon; 
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 48, 48)); 
e.Graphics.DrawIconUnstretched(ico, new Rectangle(48 0, 256, 256)); 

하지만 그는 32 × 32 버전은 무연 신 그리기 :

은 내가 시도했습니다.

이 나는 ​​시도했다 :

Icon ico = Properties.Resources.TestIcon; 
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 48, 48)); 
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 256, 256)); 

하지만 그는 32 × 32 아이콘의 신장 된 버전을 그립니다.

아이콘을 적절한 크기로 그리게하려면 어떻게해야합니까?

또한 16x16 버전을 사용하여 그립니다.

Icon ico = Properties.Resources.TestIcon; 
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 16, 16)); 
e.Graphics.DrawIconUnstretched(ico, new Rectangle(24, 0, 16, 16)); 
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 16, 16)); 

을하지만 모든 사람은 32 × 32 버전은 16 × 16로 농작물 Unstretched 호출을 제외하고, 축소 사용 : 내가 시도했습니다.

아이콘을 적절한 크기로 그리게하려면 어떻게해야합니까? 당신은 256 * 256 크기가 작동하지 않습니다 원하는 크기로 아이콘의 사본을 구성하는 schnaader의 제안에 따라


. (가)이이 일을 다음 동안

e.Graphics.DrawIcon(
     new Icon(ico, new Size(256, 256)), 
     new Rectangle(0, 0, 256, 256)); 

: 즉 (가 경우 48x48 아이콘의 축소 버전을 사용)이 작동하지 않습니다 다음

e.Graphics.DrawIcon(
     new Icon(ico, new Size(16, 16)), 
     new Rectangle(0, 0, 16, 16)); 

e.Graphics.DrawIcon(
     new Icon(ico, new Size(48, 48)), 
     new Rectangle(0, 0, 48, 48)); 
+0

당신은 두 가지 제안 된 솔루션이 당신을 위해 작동하지 않는다고 댓글을 달았습니다. 그러나 시간이 지났습니다. 적절한 아이콘 크기를 표시하는 것을 관리 했습니까? 나는 지금 비슷한 상황에 관심이 있습니다. –

답변

1

오늘은 추출하기위한 아주 좋은 기능을했다 비스타 아이콘에서 256x256 비트 맵.

큰 아이콘 (256x256)을 "정보"상자의 비트 맵으로 표시하는 데 사용합니다. 예를 들어,이 코드는 PNG 이미지로 비스타의 아이콘을 취득하고, 256 * 256의 PictureBox에 표시합니다

picboxAppLogo.Image = ExtractVistaIcon(Icon.ExtractAssociatedIcon(myIcon)); 

이 함수는 매개 변수로 아이콘 개체를 걸립니다. 따라서의 모든 아이콘 - , 파일, 스트림 등의 아이콘과 함께 사용할 수 있습니다. (EXE 아이콘을 추출하는 방법을 아래에서 읽으십시오). 이 하지 어떤에서 Win32 API를 사용 않기 때문에

그것은, 에 어떤 OS를 실행, 그것은 100 %

// Based on: http://www.codeproject.com/KB/cs/IconExtractor.aspx 
// And a hint from: http://www.codeproject.com/KB/cs/IconLib.aspx 

Bitmap ExtractVistaIcon(Icon icoIcon) 
{ 
    Bitmap bmpPngExtracted = null; 
    try 
    { 
     byte[] srcBuf = null; 
     using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) 
      { icoIcon.Save(stream); srcBuf = stream.ToArray(); } 
     const int SizeICONDIR = 6; 
     const int SizeICONDIRENTRY = 16; 
     int iCount = BitConverter.ToInt16(srcBuf, 4); 
     for (int iIndex=0; iIndex<iCount; iIndex++) 
     { 
      int iWidth = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex]; 
      int iHeight = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex + 1]; 
      int iBitCount = BitConverter.ToInt16(srcBuf, SizeICONDIR + SizeICONDIRENTRY * iIndex + 6); 
      if (iWidth == 0 && iHeight == 0 && iBitCount == 32) 
      { 
       int iImageSize = BitConverter.ToInt32(srcBuf, SizeICONDIR + SizeICONDIRENTRY * iIndex + 8); 
       int iImageOffset = BitConverter.ToInt32(srcBuf, SizeICONDIR + SizeICONDIRENTRY * iIndex + 12); 
       System.IO.MemoryStream destStream = new System.IO.MemoryStream(); 
       System.IO.BinaryWriter writer = new System.IO.BinaryWriter(destStream); 
       writer.Write(srcBuf, iImageOffset, iImageSize); 
       destStream.Seek(0, System.IO.SeekOrigin.Begin); 
       bmpPngExtracted = new Bitmap(destStream); // This is PNG! :) 
       break; 
      } 
     } 
    } 
    catch { return null; } 
    return bmpPngExtracted; 
} 

중요 :-) 코드 관리입니다! EXT 파일에서이 아이콘을 직접로드하려면 사용할 수 없습니다. (Application.ExecutablePath)을 매개 변수로 사용하십시오. .NET 함수 ExtractAssociatedIcon()이 너무 바보 같기 때문에 32x32 만 추출합니다 상!

대신 Tsuda Kageyu (http://www.codeproject.com/KB/cs/IconExtractor.aspx)가 작성한 IconExtractor 클래스를 사용하는 것이 좋습니다. 이 클래스를 약간 단순화하여 더 작게 만들 수 있습니다.

// Getting FILL icon set from EXE, and extracting 256x256 version for logo... 
using (TKageyu.Utils.IconExtractor IconEx = new TKageyu.Utils.IconExtractor(Application.ExecutablePath)) 
{ 
    Icon icoAppIcon = IconEx.GetIcon(0); // Because standard System.Drawing.Icon.ExtractAssociatedIcon() returns ONLY 32x32. 
    picboxAppLogo.Image = ExtractVistaIcon(icoAppIcon); 
} 

참고 : IconExtractor이 방법을 사용하여 내가 IconExtractor이 일을 처리하는 방법을 좋아하지 않기 때문에 나는 아직도 여기 내 ExtractVistaIcon() 함수를 사용하고 있습니다 - 첫째, 모든 아이콘 형식을 추출 IconExtractor.SplitIcon (icoAppIcon)을 사용하여 원하는 비스타 아이콘을 얻으려면 정확한 256x256 아이콘 인덱스를 알아야합니다. 그래서, 내 ExtractVistaIcon() 여기를 사용하여 훨씬 빠르고 간단한 방법입니다 :)