2011-09-16 12 views
4

DLL 파일에는 PNG 리소스 유형 내에 일부 이미지가 포함되어 있습니다..NET에서 네이티브 Win32 리소스에서 PNG 이미지 가져 오기

Resource Hacker, Anolis Resourcer & Resource Tuner와 같은 소프트웨어에서 PNG 이미지를 볼 수 있습니다. 자세한 내용은 Anolis Resourcer의 스크린 샷을 확인하십시오

http://i51.tinypic.com/9pt93c.jpg

사람이 어떻게는 PNG 이미지를받을 수 있나요 말해 줄 수 없음. 5220을 DLL 파일에서 가져 와서 PictureBox에 넣으시겠습니까? LoadImage 나 LoadBitmap과 같은 API는 작동하지 않을 것이라고 생각합니다.

+0

가 포함 된 리소스가 아니면 리소스 파일입니까? – casperOne

답변

6
// get the assembly containing the image 
var assembly = Assembly.GetExecutingAssembly(); 

// set the picturebox image to read the embedded resource 
pictureBox1.Image = Image.FromStream(
    assembly.GetManifestResourceStream("AssemblyName.test.png") 
); 

여기서 AssemblyName.test.png은 어셈블리 내의 포함 된 리소스의 정규화 된 이름입니다.


업데이트 :

당신이 네이티브 어셈블리에서 리소스를 추출하려고하는 것 같다. following article에서 P/Invoke를 사용하여이 작업을 수행하는 방법을 보여줍니다.

+0

@AnonMouse, 그 때 그것은 무엇입니까? –

+0

@AnonMouse, 이것이 관리되는 어셈블리 또는 네이티브입니까? –

+0

@AnonMouse, 오케이, 나는 이것을 달성하는 방법을 보여주는 기사에 대한 링크로 나의 대답을 업데이트했다. –

3

PNG 이미지는 표준 Win32 리소스 유형 중 하나가 아닙니다. 보통 보장 된 것은 아니지만 명명 된 자원 유형 "PNG"를 가진 이진 BLOB로 포함됩니다. 이렇게하는 가장 쉬운 방법은 Visual Studio의 File + Open + File 명령을 사용하여 파일을 여는 것입니다. 다시 리소스를 찾아 마우스 오른쪽 단추로 클릭하고 내보내기를 선택하여 디스크에 저장합니다.

프로그래밍 방식으로 수행하려면 많은 피상적 처리가 필요합니다. 리소스 유형과 리소스 ID가 모두 문자열 또는 IntPtr 일 수 있으므로 FindResource에 대해 네 가지 오버로드가 필요하므로 까다로운 작업입니다. 순서대로 코드를 실행하지 않고 파일을로드하려면 LoadLibraryEx()가 필요합니다. FindResource를 사용하여 리소스에 대한 핸들을 가져옵니다. 크기를 알 수있는 SizeOfResource. LoadResource + LockResource를 사용하여 리소스 데이터에 대한 포인터를 가져옵니다. Marshal.Copy()를 호출하여 리소스 데이터를 바이트 []로 복사합니다. FreeResource 및 FreeLibrary로 정리하십시오.

4

Darin이 게시 한 링크 (결과적으로 대답으로 표시됨)에는 기능 코드가 포함되어 있지 않습니다. 나는 거기에 게시 된 코드 (http://khason.net/blog/how-to-load-unmanaged-native-resources-from-managed-c-code/)를 평가했으며 어떤 코드에서도 제대로 작동하지 않는다는 것을 발견했다. 비트 맵 이미지로 모든 win32 dll에 포함 된 비트 맵 이미지.

또한 Hans Passant는 무수한 단계를 남겨두고 효과적으로 쓸모없는 게시물을 렌더링합니다.

내가 찾을 수 있었던 유일한 가까운 솔루션은 XP 테마 dll 쓰레기 2004 년에 작성된 기사에서 비롯됩니다. 당신은, 내가 bitmap.RotateFlip 호출,이 방법으로 많은 어려움을 꾸게 주목해야한다 여기 ThemeManager.cs 그러나 http://www.codeproject.com/KB/miscctrl/XPTaskBar.aspx

의 'GetResourcePNG'방법을 찾을 수 있습니다 (RotateFlipType.Rotate180FlipX) ; 내가 여기에 나열된 코드를 (발견했습니다

http://www.vbaccelerator.com/home/NET/ : 내 시스템

업데이트에 authui.dll 내에서 액세스 PNG 파일로하려고 할 때 메모리 문제가 발생 코드/컨트롤/Explorer_Bar/ExplorerBar_Control_Source_Code.asp)가 가장 기능적으로 가장 적은 오류를 생성하고 가장 빠른 결과를 생성합니다. 코드는 도메인 이름이 다름을 나타내지 만 C#으로 작성됩니다.두 클래스 사용하기. ImageUtility 및 ResourceLibrary, 당신은 쉽게 표준 밖으로 PNG를 뽑을 수, non-.net 리소스 라이브러리/DLL :

public static Bitmap GetStandardResourceBitmap(String dllName, String resourceId) { 
     Bitmap result = null; 

     using (ResourceLibrary library = new ResourceLibrary() { Filename = dllName }) { 
      IntPtr hDib = library.GetResource(resourceId, ResourceLibrary.ImageType.IMAGE_BITMAP, ResourceLibrary.ImageLoadOptions.LR_CREATEDIBSECTION); 
      if (!hDib.Equals(IntPtr.Zero)) { 
       result = ImageUtility.DibToBitmap(hDib); 
       ImageUtility.DeleteObject(hDib); 
      } 
     } 

     return result; 
    } 

나는 그것이 필요하지 않는 경우에만 있기 때문에, 내 방법에 문자열을 RESOURCEID을하기로 결정했습니다 과부하 및 번호가 매겨진 자원 ID 사용은 '#'을 선행하는 것처럼 간단합니다.

GetStandardResourceBitmap("shell32.dll", "#632"); 

건배

+0

나는 아무것도 놓치지 않았다. 당신은 전체 스레드를 읽지 못했다. 그가 게시 한 코드는 win32 dll 내의 리소스와 함께 작동하지 않으며 표준 win32 dll에서 자원에 대해 기능적으로 링크 된 코드도 아닙니다. 전체 게시물을 읽으면 그걸 수집했을 것입니다. 표준 DLL의 비 PNG 비트 맵 리소스의 경우 Bitmap.FromResource가 사용할 메서드입니다. 그러나 "PNG"리소스 유형에 나열되지 않은 PNG는 내가 링크 된 코드의 개요와 같이 다른 문제를 나타냅니다. – shellscape