2012-11-08 4 views
2

PictureBox 배열을 가져 와서 그림 목록 (png 파일 형식)을 표시하려고합니다.프로젝트 관련 사진을 저장하는 좋은 방법은 무엇입니까?

.NET ImageList 컨트롤을 사용하려고했지만 사진의 크기를 조정해야한다고 주장했습니다. 또한 이러한 png 파일의 투명한 배경을 지원하지 않습니다.

나는이처럼 내 파일을 검색 할 Assembly를 사용하려고 :
_imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.png"); 하지만 코드는 나에게 어떤 리소스 파일을 반환하지 않습니다 않으며 어떤 런타임 오류가 발생 않습니다.

제 질문은 다른 방법이 있습니까? 또는 더 나은 아직, 어떻게 든 내 사진을 변경하지 않도록 ImageList 컨트롤을 만들 수 있습니까? 감사.

답변

0

나는 이것이 가장 좋은 하나 아니라고하지 확신하지만 당신은 이런 식으로 뭔가를 시도 할 수 있습니다 : -

Assembly ambly = Assembly.LoadFile(pathToDll); 

또는

BitMap bitMap; 
// where "ns" is the default namespace of the resource project  
using (Stream resourceStream = ambly.GetManifestResourceSream("ns.image.jpg")) 
{ 
    bitMap = BitMap.FromStream(resourceStream); 
} 

예 : -

interface IThemeResourceProvider 
{ 
Stream LoadBigLogo(); 
Stream LoadSmallLogo(); 
} 

그런 다음 리소스 라이브러리에 해당 인터페이스를 구현하십시오.

public class ThemeResourceProvider : IThemeResourceProvider 
{ 
public Stream LoadBigLogo() 
{ 
    Assembly ambly = Assembly.GetExecutingAssembly(); 
    return ambly.GetManifestResourceStream("namespace.image.jpg"); 
    } 

    (...) 
    } 

마지막으로, 인스턴스화 대신 기본 응용 프로그램에서 직접 자원을로드하는 IThemeResourceProvider 지금 당신이 목록에서 IEnumerable을 가지고있는 리소스 라이브러리

Assembly assembly = Assembly.LoadFile(pathToDll); 

    var results = from type in assembly.GetTypes() 
      where typeof(IThemeResourceProvider).IsAssignableFrom(type) 
      select type; 

에서 발견. 일반적으로 하나만 가질 수 있지만이 방법을 사용하면 여러 리소스 세트를 호스팅하고 동일한 리소스 DLL에 여러 IThemeResourceProviders를 구현할 수 있습니다. 예 : 각 IThemeResourceProvider를 특성으로 식별하거나 다양한 구현에서 사용자 정의 [Attribute] 데코레이션을 사용하여 식별하십시오. 알아낼 수 있도록 나머지는 네가 맡길거야. 이것은 내가 누군가로부터받은 코드가

BitMap bitMap; 
    using (Stream resourceStream = provider.LoadBigLogo()) 
    { 
    bitMap = BitMap.FromStream(resourceStream); 
    } 
0

:

하지만, 여기에 비트 맵을 얻기 위해 이러한 공급자 중 하나를 사용하여,

foreach (var providerType in results) 
    { 
    var constructorInfo = providerType.GetConstructor(Type.EmptyTypes); 
    IThemeResourceProvider provider = constructorInfo.Invoke(null); 
    } 

그리고 마지막으로 목록에 IThemeResourceProviders을 인스턴스화하는 방법 그리고 그것은 나를 위해 잘 작동했습니다!

private void SetImage(PictureBox pb) { 
     try { 
      Image img = pb.Image; 

      Size imgSize = GenerateImageDimensions(img.Width, img.Height, pb.Width, pb.Height); 
      Bitmap finalImg = new Bitmap(img, imgSize.Width, imgSize.Height); 
      Graphics gfx = Graphics.FromImage(img); 
      gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 

      pb.Image = null; 
      pb.SizeMode = PictureBoxSizeMode.AutoSize; 
      pb.Image = finalImg; 
     } catch(Exception ex) { 

     } 
    } 
    public Size GenerateImageDimensions(int currW, int currH, int destW, int destH) { 
     //double to hold the final multiplier to use when scaling the image 
     double multiplier = 0; 

     //string for holding layout 
     string layout; 

     //determine if it's Portrait or Landscape 
     if(currH > currW) layout = "portrait"; 
     else layout = "landscape"; 

     switch(layout.ToLower()) { 
      case "portrait": 
       //calculate multiplier on heights 
       if(destH > destW) { 
        multiplier = (double) destW/(double) currW; 
       } else { 
        multiplier = (double) destH/(double) currH; 
       } 
       break; 
      case "landscape": 
       //calculate multiplier on widths 
       if(destH > destW) { 
        multiplier = (double) destW/(double) currW; 
       } else { 
        multiplier = (double) destH/(double) currH; 
       } 
       break; 
     } 

     //return the new image dimensions 
     return new Size((int) (currW * multiplier), (int) (currH * multiplier)); 
    } 

편집 : 전체 공개는 모든 이미지가 jpg이므로 투명 배경을 어떻게 처리 할 것인지 실마리가 없습니다.

EDIT 2 : 또한 사용자의 필요에 맞게 pb.SizeMode을 조정해야합니다. 내가 한 방식은 PictureBox의 최대 크기를 설정하는 것이 었습니다.

관련 문제