C#으로다가 이미지, 혹은 텍스트 워터마크 만들기
파일 다이알 로그로다가 워터 마크 이미지 받아서.

클립보드에 들어 있는 이미지에 워터 마크 삽입..

항상 컴퓨터에 상주시켜 놓고 복사할때마다 워터마크 자동으로 넣어주는 프로그램을 만들고 싶으나.

귀찮아서 패스~

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

아~ 개으름뱅이 

 

try
{
	OpenFileDialog ofd = new OpenFileDialog();
	ofd.Filter = "Images (*.BMP;*.JPG;*.GIF;*.PNG)|*.BMP;*.JPG;*.GIF;*.PNG";
	ofd.Multiselect = false;
	ofd.RestoreDirectory = true;
	ofd.CheckFileExists = true;
	ofd.CheckPathExists = true;
	ofd.InitialDirectory = @"D:\Angeleyes\SlrClub Images Template";
	DialogResult di = ofd.ShowDialog();
	if (di.Equals(DialogResult.OK))
	{
		//System.IO.Stream st = ofd.OpenFile();
		//Bitmap bit = new Bitmap(st);

		Image img = Clipboard.GetImage();
		if (img != null)
		{
			//Graphics gra = Graphics.FromImage(img);
			//Image watermark = Image.FromStream(ofd.OpenFile());
			//Bitmap logo = new Bitmap(watermark);

			//logo.SetResolution(img.HorizontalResolution, img.VerticalResolution);

			//gra.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
			//gra.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.GammaCorrected;
			//gra.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
			//gra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
			//gra.DrawImage(logo, new Point(70, 70));

			////img.Save(@"C:\test.jpg");
			//pictureBox1.Image = img;

			string Copyright = "Copyright � 2011 - Angeleyes.kr";

			Image imgPhoto = Clipboard.GetImage();
			int phWidth = imgPhoto.Width; int phHeight = imgPhoto.Height;

			using (Bitmap bmPhoto = new Bitmap(phWidth, phHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
			{
				bmPhoto.SetResolution(72, 72);

				using (Graphics grPhoto = Graphics.FromImage(bmPhoto))
				{
					Image imgWatermark = new Bitmap(Image.FromStream(ofd.OpenFile()));
					int wmWidth = imgWatermark.Width;
					int wmHeight = imgWatermark.Height;

					grPhoto.DrawImage(
						imgPhoto,
						new Rectangle(0, 0, phWidth, phHeight),
						0,
						0,
						phWidth,
						phHeight,
						GraphicsUnit.Pixel);

					#region // Copyright //
					int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4 };
					Font crFont = null;
					SizeF crSize = new SizeF();
					for (int i = 0; i < 7; i++)
					{
						crFont = new Font("arial", sizes[i], FontStyle.Regular);
						crSize = grPhoto.MeasureString(Copyright, crFont);

						if ((ushort)crSize.Width < (ushort)phWidth)
							break;
					}

					int yPixlesFromBottom = (int)(phHeight * .05);
					float yPosFromBottom = ((phHeight - yPixlesFromBottom) - (crSize.Height / 2));
					float xCenterOfImg = (phWidth / 2);

					StringFormat StrFormat = new StringFormat();
					StrFormat.Alignment = StringAlignment.Center;

					SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0));

					grPhoto.DrawString(Copyright,
						crFont,
						semiTransBrush2,
						new PointF(xCenterOfImg + 1, yPosFromBottom + 1),
						StrFormat);

					SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));

					grPhoto.DrawString(Copyright,
						crFont,
						semiTransBrush,
						new PointF(xCenterOfImg, yPosFromBottom),
						StrFormat); 
					#endregion

					Bitmap bmWatermark = new Bitmap(bmPhoto);
					bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

					Graphics grWatermark = Graphics.FromImage(bmWatermark);

					System.Drawing.Imaging.ImageAttributes imageAttributes =
							new System.Drawing.Imaging.ImageAttributes();
					System.Drawing.Imaging.ColorMap colorMap = new System.Drawing.Imaging.ColorMap();

					colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
					colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
					System.Drawing.Imaging.ColorMap[] remapTable = { colorMap };

					imageAttributes.SetRemapTable(remapTable, System.Drawing.Imaging.ColorAdjustType.Bitmap);

					float[][] colorMatrixElements = {
												new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f}
												,new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f}
												,new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f}
												,new float[] {0.0f,  0.0f,  0.0f,  0.3f, 0.0f}
												,new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}
											};

					System.Drawing.Imaging.ColorMatrix wmColorMatrix = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements);

					imageAttributes.SetColorMatrix(wmColorMatrix, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap);

					int xPosOfWm = ((phWidth - wmWidth) - 10);
					int yPosOfWm = 10;

					grWatermark.DrawImage(imgWatermark,
						new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight),
						0,
						0,
						wmWidth,
						wmHeight,
						GraphicsUnit.Pixel,
						imageAttributes);

					imgPhoto = bmWatermark;
				}
			}

			pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
			pictureBox1.Image = imgPhoto;
			Clipboard.SetImage(imgPhoto);

			img.Dispose();
			imgPhoto.Dispose();
		}
		else
			MessageBox.Show("img Null");
	}
	else
		MessageBox.Show(di.ToString());
}
catch (Exception ex)
{
	MessageBox.Show(ex.ToString());
}





C#을 이용한 Windows Service 를 만들어 보도록 하겠습니다.

 

먼저 프로젝트 추가

 

 

프로젝트를 생성하게 되면 Program.cs, Service1.cs 파일이 생성됩니다.

 

Program.cs 에서는 최초 Serivce 될 Class를 실행 시키는 코드가 들어 있습니다.

즉, Service1.cs 파일을 삭제 한 후 새로운 파일의 ServiceBase 클래스 추가 시에는 Program.cs 에 실행 Class 명을 변경하여 주셔야 됩니다.

 

using System.Collections.Generic;
using System.ServiceProcess;
using System.Text;

namespace WindowsService2
{
	static class Program
	{
		/// 
		/// 해당 응용 프로그램의 주 진입점입니다.
		/// 
		static void Main()
		{
			ServiceBase[] ServicesToRun;

			// 동일한 프로세스 내에서 사용자 서비스가 두 개 이상 실행될 수 있습니다.
			// 이 프로세스에 다른 서비스를 추가하려면 다음 줄을 변경하여 두 번째
			// 서비스 개체를 만듭니다. 예를 들면 다음과 같습니다.
			//
			//   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
			//
			ServicesToRun = new ServiceBase[] { new Service1() };

			ServiceBase.Run(ServicesToRun);
		}
	}
}

 

현재 서비스에 대해서 설치관리자를 이용하여 수정하도록 하겠습니다.

 

추가하는 방법은 Service.cs[디자인]에서 오른쪽 버튼 클릭 ==> 설치관리자 추가를 이용하여 설치관리자를 추가 할 수 있습니다.

 

 

추가 하게 되면 자동으로 System.ServiceProcess, System.Management 가 참조 추가 되며,

ProjectInstaller.cs 파일도 추가 됩니다.

 

 

 

ProjectInstaller 에는 ServiceInstaller, ServiceProcessInstaller 가 생성되며, ServiceInstaller를 선택하고 설정 창에서 해당 서비스에 대하여 설정 할 수 있습니다.

 

ServiceInstaller에서는 서비스 이름과 설명 그리고 서비스 실행 타입(자동, 수동, 중지)을 ServiceProcessInstaller 에서는 서비스의 실행 권한 설정을 할 수 있습니다.

 

 

서비스 실행 후 실행 코드는 Service1.cs 에서 작성 가능하며, 좀더 자세한 내용은 아래 링크에서 도움 받으시기 바랍니다.

*_*;;;;;;

 

http://msdn.microsoft.com/ko-kr/library/y817hyb6%28VS.80%29.aspx

 

죄송합니다.

대충대충 해서 ㅋ~

 

아래는 디버깅 방법

 2009/02/24 - [Developer/[.NET] C#] - Debugging windows service Onstart

아래는 설치프로젝트를 이용한 서비스 등록 방법

 2009/11/30 - [Developer/[.NET] C#] - C# Windows Service Installer 만들기

 

감사합니다.

  1. Favicon of http://blog.naver.com/vactorman BlogIcon 에로로 2011.10.27 11:10

    좋은 내용 감사합니다~

    Windows Service관련 내용에 링크 걸어갈게요~

C#으로  Windows Service Installer를 만들어 보겠습니다~

Windows Service 생성 방법은 아래 링크를 참조하여 주시기 바랍닏다.

2009/11/30 - [Developer/[.NET] C#] - Create Windows Service In C#

 

먼저 프로젝트 추가

 

 

기타 프로젝트 형식에서 설치 및 배포 ==> 설치 프로젝트를 선택합니다.

 

생성 된 프로젝트에 설치할 Window Service 를 추가합니다.

 


프로젝트 출력을 선택한 후 해당 프로젝트를 선택합니다.

 

 

그러면 해당 프로젝트가 설치 프로젝트에 로드 되며, 발견된 종속성에도 Microsoft .NET framework가 생성 됩니다.

 

 

설치 프로젝트에서 오른쪽 버튼을 선택 한 후 보기에서 사용자 지정 작업을 선택합니다.

 

 

그러면 아래와 같은 화면이 나타나는데

여기에서 사용자 지정 작업에서 오른쪽 버튼을 선택하여 사용자 지정 작업을 추가합니다.

 

 

 

그러면 아래와 같은 화면이 나오는데요.

여기에서 응용 프로그램 폴더를 선택합니다.

 

 

해당 프로젝트를 선택 한 후 확인

 

위와 같은 화면이 되면 설정이 모두 끝나게 됩니다.

 

설치 프로젝트에서. 설치, 및 제거 가 가능하니 한번씩 테스트 해 보시기 바랍니다.

 

정상적으로 서비스에 해당 프로젝트가 로드 되는지 말입니다.


아래 경로에서 동일한 내용을 확인 하실 수 있습니다.

http://support.microsoft.com/kb/317421

 

 

감사합니다~


2009/02/24 - [Developer/[.NET] C#] - Debugging windows service Onstart



윈도우 서비스를 등록 후.

서비스는 바로 시작되지 않습니다..

 

코드단에서 처리를 해야 되는데요..

 

코드는 좀.. 간단합니다.

 

service Installer 에서 작성하시면 됩니다..
프로그램 UnInstall 시에는 아래와 같이 코드를 입력해 주셔야.
서비스가 정상적으로 중지. 삭제 됩니다...

아래와 같이 작성 되지 않을 경우. 서비스가 제대로 삭제 되지 않거나..
이상해집니다. *_*;;;;



2009-03-30 수정 되었습니다...

2009/02/24 - [Developer/[.NET] C#] - Debugging windows service Onstart


  1. Favicon of http://www.javarush.com BlogIcon tornado 2009.03.27 16:26

    삭제도 잘 돼...
    BeforeUnInstall 이벤트에서 종료시키면 돼. 종료시킬때 시간이 좀 걸리더라 ㅋ

  2. Favicon of http://angeleyes.tistory.com BlogIcon Angeleyes 2009.03.30 16:53

    ㅎㅎ 제가 시점을 잘못 짚었었어요...
    중지를 시키고 삭제를 해야 되는데
    삭제 시키고 중지를 시키는 바보같은 짓을.. ㅋㅋ


윈도우 서비스 실행 시 에러가 나게 되면.
에러 메시지를 볼 수 있는 방법은 로그를 찍던지 해야 됩니다만..


그런 불편함을 항상 가지고 갈 수 없습니다..

코드를 아래와 같이 작성 하게 되면…

protected override void OnStart(string[] args)
{
	// TODO: 여기에 서비스를 시작하는 코드를 추가합니다.
	System.Diagnostics.Debugger.Launch();
	FileWatcher fw = new FileWatcher(System.Windows.Forms.Application.StartupPath);
	fw.OnInit();
}




위의 이미지를 띄워서 디버깅 걸 수 있습니다.

윈도우 서비스가 실행 될때가 아니라면 Process Attach 로 확인 할 수 있습니다만.
위 방법은 서비스 실행 시 방법입니다.

Windows service 생성 및 설치 방법은 아래 링크들을 확인하여 주시기 바랍니다.
2009/11/30 - [Developer/[.NET] C#] - Create Windows Service In C#
2009/11/30 - [Developer/[.NET] C#] - C# Windows Service Installer 만들기

+ Recent posts