2012-02-18 2 views
0

에서 런타임에. 내가 런타임에 PNG로 파일에 텍스트를 그릴 수 있어야합니다 2,010 대 C#을 윈폼

응용 프로그램 시작을 (의 WinForm 응용 프로그램 2010 C#)를 이미지를 수정하고 도구 모음

고객을로드 고객이 수정이 아이콘의 botton을 코너를 왼쪽으로 숫자 나 문자 하나를 추가해야 도구 모음에서 아이콘을로드 할 때이 시점에서

를 검색합니다. PNG (파일)

내가 함께 연주 한 내가 할 수있는 것을보기위한 이상한 앱.하지만 나는 기쁘다. 몇 가지 문제. ,

  1. 어떻게 (내 테스트에 하드 코딩하고)
  2. 내가 텍스트를 그릴 수 있어요. 내 PNG 파일의 경로를받을 수 있나요하지만 내가 도구 모음을 다시로드해야 추측 displayed.I 아니다 아니?
  3. 2 번 이상 아이콘에 글자를 쓸 때 이전 글자 위에 씁니다. 이전 글자를 지우거나 지우고 새 글자를 지우고 싶습니다.

의견이 있으십니까?

내 임시 코드 :

private void button1_Click(object sender, EventArgs e) 
    { 

     string filename = @"c:\WinFormTest\Resources\column.png"; 

     var bitmapImage = new Bitmap(Properties.Resources.column); 
     bitmapImage.DrawText("A", new Font("Arial", 8), Brushes.Black, new RectangleF(0, 0, 500, 500), filename); 

    } 
} 

public static class ImageExtensions 
{ 
    public static Bitmap DrawText(this Bitmap image,string textToDraw,Font font,Brush brush,RectangleF rectangleF,string filename="") 
    { 
     if(image==null) throw new ArgumentNullException(); 
     if(font==null)throw new ArgumentNullException(); 
     if (brush == null) throw new ArgumentNullException(); 
     if (rectangleF == null) throw new ArgumentNullException(); 

     var format = filename.GetImageFormat(); 
     var newBitmap = new Bitmap(image, image.Width, image.Height); 
     using (var graphics = Graphics.FromImage(newBitmap)) 
     { 
      graphics.DrawString(textToDraw, font, brush, rectangleF); 
     } 
     if (!string.IsNullOrEmpty(filename)) 
     {newBitmap.Save(filename, format);} 
     return newBitmap; 
    } 
    public static ImageFormat GetImageFormat(this string fileName) 
    { 
     if (string.IsNullOrEmpty(fileName)) 
      return ImageFormat.Bmp; 
     if (fileName.EndsWith("jpg", StringComparison.InvariantCultureIgnoreCase) || fileName.EndsWith("jpeg", StringComparison.InvariantCultureIgnoreCase)) 
      return ImageFormat.Jpeg; 
     if (fileName.EndsWith("png", StringComparison.InvariantCultureIgnoreCase)) 
      return ImageFormat.Png; 
     if (fileName.EndsWith("tiff", StringComparison.InvariantCultureIgnoreCase)) 
      return ImageFormat.Tiff; 
     if (fileName.EndsWith("ico", StringComparison.InvariantCultureIgnoreCase)) 
      return ImageFormat.Icon; 
     if (fileName.EndsWith("gif", StringComparison.InvariantCultureIgnoreCase)) 
      return ImageFormat.Gif; 
     return ImageFormat.Bmp; 
    } 


} 

답변

0

파일에 대해 걱정할 필요없이 런타임에이를 수행 할 수 있습니다. 임베디드 리소스를 사용하는 경우 파일 이름에 대해 걱정할 필요가 없으며 이전 세션의 변경 사항을 지우고 파일에 기록 할 필요가 없습니다. 기본적으로 Toolstrip 버튼을 만들면 포함 된 리소스가 사용됩니다 (프로젝트에서 resx 파일을 사용하는 경우 다른 양식에서 사용하는 공유 리소스를 참조 할 수 있음). 하지만 일단이 작업을하면 이미지를 복제 (새 비트 맵 만들기) 할 필요조차 없습니다. 여기에 적절한 이미지를 업데이트 할 몇 가지 매우 간단한 예제 코드입니다 :

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     ((Bitmap)toolStripButton1.Image).DrawText("B", Font, SystemBrushes.ControlText, 
     new RectangleF(new PointF(0, 0), toolStripButton1.Image.Size)); 
    } 
} 

public static class ImageExtensions 
{ 
    public static void DrawText(this Bitmap image, string stringToDraw, Font font, 
     Brush brush, RectangleF rectangleF) 
    { 
     using (Graphics g = Graphics.FromImage(image)) 
     { 
     g.DrawString(stringToDraw, font, brush, rectangleF); 
     } 
    } 
} 

이미지 파일에 저장되지 않기 때문에, 그것은 자동으로 프로그램이 실행될 때마다 재설정됩니다. 그게 니가 원하는거야, 그렇지?

프로그램이 실행되는 동안 이미지를 재설정해야하는 경우 InitializeComponent에서 이미지를 설정하는 생성 된 코드를 복사 할 수 있습니다.예 :

private void toolStripButton1_Click(object sender, EventArgs e) 
    { 
    this.toolStripButton1.Image.Dispose(); 
    System.ComponentModel.ComponentResourceManager resources = 
     new System.ComponentModel.ComponentResourceManager(typeof(Form1)); 
    this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); 
    ((Bitmap)toolStripButton1.Image).DrawText("C", Font, SystemBrushes.ControlText, 
     new RectangleF(new PointF(0, 0), toolStripButton1.Image.Size)); 
    } 
+0

@ BlueMonkMN. 시간과 코드에 감사한다. 새로운 고객을로드 할 때마다 적절한 문자 또는 숫자로 아이콘을 수정해야합니다. 코드를 실행하려면 "myImage"가 내 새 이미지를 참조해야합니까? 오버 라이드에 대해 잘 모름 OnPaint.thanks – user9969

+0

Ii가 OnPaint 함수로 테스트했습니다. 무시해. 나는 그것을 지금 삭제했다. – BlueMonkMN

0
  1. 당신은 욕망 파일 또는 폴더를 선택하고 파일/폴더 선택기를 사용하거나이 설정 파일이나 데이터베이스에 저장할 수 있습니다. Here은의 app.config에 저장하는 방법을 예입니다

  2. 그래픽이 changes.Like이 저장하는 객체의

    당신은 세척 방법을 사용한다 :

    graphics.Flush를();

  3. 그런 다음 그 위에 레이어를 렌더링함으로써 세 번째 사진을 만들 수있는 이미지 자체를 변경하는 대신 사진 (같은 크기의 다른 비트 맵) 을 통해 레이어를 사용하여 최종 이미지를 생성하지만 당신은 자유가 불필요한 레이어들을 없애는 것. .

+0

작은 예제 (코드)의 가능성이 있습니다 .1) 구성 파일에 경로를 저장할 수 있습니다 .2) 어떻게 좋을지 모르지만 어떻게해야할지 모르겠다. 3) 어떻게해야할지 모르겠습니다. 어떤 코드 샘플 어딘가에 – user9969

+0

1. 나는 그것을하는 방법을 보여주는 링크를 추가했다 .2. 나는 코드를 추가했다. 3. 샘플이있을 경우 확실하지 않다. 구글 검색이 도움이 될지도 모른다. – Beatles1692