2010-01-18 6 views
2

내가 뭘 하려는지 이미지를 중첩하지 않고 이미지에 쓰는 것입니다. 그래서 나는 이미지에 실제로 영향을 미치거나 이미지를 스트레칭하지 않고 워터 마크 (문자열)를 아래쪽에 놓는 이미지에 워터 마크를 넣고 싶습니다. 나는 이미 문자열을 이미지로 변환하는 방법을 알고 있으며, 워터 마크를 달성하는 데 문제가 있습니다.C# 오버랩없이 이미지 워터 마크

1) 원 화상
3)를 포함하는 워터 마크 비트 맵을 조금 연장 스트레칭하지 우측 아래
2)에 이미지를 캐릭터 작성?

누구나 예제 나 아이디어가 있습니까? 어떤 의미가 없으면 나는 어떤 질문에 대답하려고 노력할 것이다.

비트 맵 예 :

여기

이다 내가 20처럼 X에 의해 단지 크기를 증가 어떻게 내가 비트 맵을 얻기 위해 사용하는 코드?

Bitmap original = (Bitmap)System.Drawing.Image.FromFile(coveted); 
Bitmap newImage = new Bitmap(original); 

그리고 난 내가 이미지의 맨 아래 오른쪽에 문자열을 쓰기 위해 필요한 공간을 확인 어떻게 두 번째 부분은 전체 문자열에있는 동안 피팅 것 같다 ...

@ROY : 이것은 내가 한 편집입니다.

이 분류는 작동하지만 하나의 워터 마크가 다른 워터 마크 아래에 나타납니다. 만약 내가 같은 라인에 그들을 얻을 수 있다면 그것은 완벽 할 것이다!

private static Bitmap WatermarkImage2(Bitmap bmpOriginal, String waterMark2) 
    { 
     using (Graphics gfxOriginal = Graphics.FromImage(bmpOriginal)) 
     { 
      using (Font fntWatermark = new Font("Arial", 24, FontStyle.Regular)) 
      { 
       SizeF szWatermark = gfxOriginal.MeasureString(waterMark2, fntWatermark, int.MaxValue); 
       Bitmap bmpWatermarked2 = new Bitmap(bmpOriginal.Width, bmpOriginal.Height + (int)(szWatermark.Height * 2)); 
       using (Graphics gfxWatermarked = Graphics.FromImage(bmpWatermarked2)) 
       { 
        gfxWatermarked.Clear(Color.White); 
        gfxWatermarked.DrawImageUnscaled(bmpOriginal, 0, 0); 
        gfxWatermarked.DrawString(waterMark2, fntWatermark, Brushes.Black, 0, (bmpOriginal.Height + szWatermark.Height) - (szWatermark.Height/2)); 
       } 
       return bmpWatermarked2; 
      } 
     } 
    } 
+0

가 지정한 수 GDI (System.Drawing) 또는 다른 라이브러리? – Skurmedel

+0

"겹치지 않고" "실제로 영향을 미치지 않고"라는 의미를 명확히 할 수 있습니까? 중요한 시각적 요소가없는 비트 맵의 ​​섹션에 텍스트를 인쇄 하시겠습니까? 어떻게 정의하겠습니까? 또한 "스트레칭하지 않음"과 "약간 확장하다"의 차이점은 무엇입니까? 이미지 하단에 검정색 막대를 추가하고 텍스트를 그 곳에 넣으시겠습니까? 그건 진짜 워터 마킹이 아니에요. –

+0

잘 무엇입니까, 당신은 하단에있는 검은 막대가 올바른 생각입니다,하지만 난 단지 비트 맵을 확장하고 확장에 우표를 쓸 싶습니다 –

답변

2

이 당신을 위해 작동 할 수 있습니다

private static Bitmap WatermarkImage(Bitmap bmpOriginal, String waterMarkLeft, String waterMarkRight) 
    { 
     using (Graphics gfxOriginal = Graphics.FromImage(bmpOriginal)) 
     { 
      using (Font fntWatermark = new Font("Arial", 12, FontStyle.Regular)) 
      {      
       SizeF szWatermarkLeft = gfxOriginal.MeasureString(waterMarkLeft, fntWatermark, int.MaxValue); 
       SizeF szWatermarkRight = gfxOriginal.MeasureString(waterMarkRight, fntWatermark, int.MaxValue); 

       float heightWatermark = szWatermarkLeft.Height > szWatermarkRight.Height ? szWatermarkLeft.Height : szWatermarkRight.Height; 

       Bitmap bmpWatermarked = new Bitmap(bmpOriginal.Width, bmpOriginal.Height + (int)(heightWatermark * 2)); 

       using (Graphics gfxWatermarked = Graphics.FromImage(bmpWatermarked)) 
       { 
        gfxWatermarked.Clear(Color.White); 
        gfxWatermarked.DrawImageUnscaled(bmpOriginal, 0, 0); 
        gfxWatermarked.DrawString(waterMarkLeft, fntWatermark, Brushes.Black, 0, (bmpOriginal.Height + heightWatermark) - (szWatermarkLeft.Height/2)); 
        gfxWatermarked.DrawString(waterMarkRight, fntWatermark, Brushes.Black, (bmpOriginal.Width - szWatermarkRight.Width), (bmpOriginal.Height + heightWatermark) - (heightWatermark/2));       
       } 

       return bmpWatermarked;           
      } 
     } 
    } 

그런 다음 당신이 이런 식으로 부를 것이다 : 위의 코드와 결합

using (Bitmap bmpWatermarked = WatermarkImage((Bitmap)Bitmap.FromFile(@"c:\\test.bmp"), @"Copyright (C) A Corp.")) 
{ 
    bmpWatermarked.Save(@"c:\watermarked.bmp"); 
} 

: 당신이 사용하는 경우

Bitmap original = (Bitmap)System.Drawing.Image.FromFile(coveted); 
Bitmap newImage = new Bitmap(original); 
using (Bitmap bmpWatermarked = WatermarkImage(newImage, @"Copyleft (C) A Corp.", @"Copyright (C) B Corp.")) 
{ 
    bmpWatermarked.Save(@"c:\watermarked.bmp"); 
} 
+0

좋아 보인다. 그냥 몇 가지 메모 : DrawImageUnscaled() 실제로 작동하지 않습니다. 이미지 크기를 설정하는 오버로드를 사용하십시오. 그리고 Image.Save()는 기본적으로 BMP 형식으로 저장하지 않습니다. 파일 이름을 .png로 변경합니다. –

+0

@roy이 부분을 컴파일 할 때 사용할 수 없습니다 (Bitmap bmpWatermarked = WatermarkImage ((Bitmap) Bitmap.FromFile (newImage, true), @ "저작권 (C) A Corp.")) 오류가 발생했습니다. 'System.Drawing.Image.FromFile (string, bool)'에 가장 적합한 오버로드 된 메서드가 잘못된 인수를 가지고 있습니다. –

+0

@Mike - You Bitmap 객체 인'newImage'를 전달하고 있습니다. 대신'@ "c : \\ test.bmp"'파일의 이름을 전달해야합니다. newImage를 실제로 전달하기를 원한다면 함수를 호출 할 필요가 없으며 WatermarkImage에 인수로 newImage를 넘길 수 있습니다. 이렇게 : WatermarkImage (newImage, "@Copyright")' –

1

그것은 당신이 단순히 원본보다 이미지를 더 크게 만들 및 이미지 바닥 글 등의 하단에 "워터 마크"를 포함한다 수행 할 작업 같은 소리.

원본 이미지보다 큰 새 Bitmap 개체를 만들면됩니다 (워터 마크 양만큼). 그런 다음 Graphics DrawImageUnscaled 메서드를 사용하여 원래 이미지를 0,0에 그리고 그 아래쪽 (또는 오른쪽 또는 어디든지)에 워터 마크 이미지를 그립니다.

+0

그게 내가 추측하고 있지만 어떻게 오른쪽 하단을 결정합니까 coords와 나의 전체 워터 마크를 포함 할 충분한 공간. 나는 MeasureString을 사용하는 것을 알고 있지만 함께 결합하기 위해 많은 시간을 할애하고 있습니다 –

+0

MeasureString에 특정 문제가있는 경우 가지고있는 코드를 게시하는 것이 좋습니다. 또한 MeasureString이 정확히 ... 정확하지 않다는 것을 알아 두십시오.글꼴의 평균 너비를 사용하여 특정 메트릭을 결정합니다. – Nick

+0

그것은 측정 스트링과 아무 관련이 없습니다. 어떻게하면 문자열을 기반으로 비트 맵을 확장합니까? –