2012-01-31 1 views
1

저는 ASP.NET/C#/GDI +를 사용하여 일부 이미지 변환 작업을하고 있습니다.ASP.NET/C#에서 GDI +를 사용하여 이미지를 클리핑 할 때 앤티 앨리어싱을 사용합니까?

public static Image MakeRound(Image img) 
{ 
    Bitmap bmp = new Bitmap(img.Width, img.Height); 

    GraphicsPath gp = new GraphicsPath(); 
    Graphics gr = Graphics.FromImage(bmp); 

    using (gp) 
    { 
     gp.AddEllipse(0, 0, img.Width, img.Height); 
     using (gr) 
     { 
      gr.SetClip(gp); 
      gr.DrawImage(img, Point.Empty); 
     } 
    } 
    return bmp; 
} 

그것은 사각형 이미지를 소요하고 타원 그 이미지로 큰 추가 :이처럼 보이는 방법은 둥근 사각형 이미지를 확인해야합니다. 그런 다음 SetClip을 사용하여 경로 외부에있는 모든 것을 제거하고 둥근 이미지를 반환합니다. 이는 의도 한대로 작동합니다.

그런 다음 반환 된 이미지는 특정 위치의 다른 (큰) 이미지로 그려지고 결과 합성 이미지는 파일로 저장됩니다. 이것을 사용하는 방법의 실제 예는 로고나 워터 마크를 기존 이미지에 추가하는 것입니다.

// Get backdrop image from server 
string backdropPath = Server.MapPath("/img/backdrop.jpg"); 
System.Drawing.Image backdrop = Bitmap.FromFile(backdropPath); 

// Create a graphics object to work with 
Graphics gra = Graphics.FromImage(backdrop); 
gra.DrawImage(MakeRound(smallerImage), new Point(50,50)); 

// Save the new image 
backdrop.Save(saveFilePath); 

유일한 문제는 중첩/라운드의 에지/화상 조금 거칠고 리턴이다 : 여기에서이 동작하는 코드이다. 나는 그것의 가장자리를 매끄럽게 만들어서 더 큰 배경 이미지와 더 잘 섞이게하고 싶습니다.

사용할 수있는 안티 앨리어싱 매개 변수가 있습니까? 위의 방법으로이 스무딩을 수행해야한다고 생각하거나 둥근 이미지가 큰 배경 위에 겹쳐져있을 때 적용됩니까?

모든 도움말과 팁을 환영합니다!

답변

1

당신이 찾고있는 기법은 페더 링 (Feathering)이라고합니다. 즉, 페더 링 된 가장자리는 그려진 이미지의 가장자리에 적용되는 앤티 앨리어싱의 한 형태입니다.

이 게시물을 soft edges in GDI+에서보십시오. 그것은 귀하의 시나리오에 적용될 수 있습니다.

+0

네,이 줄을 따라 뭔가를 찾은 것 같아요. Dan Byströms 기법을 내 솔루션에 적용 할 때 나는 겹쳐지고있는 둥근 이미지에 가장자리가 희미 해집니다. 그래서 그것은 작동합니다! 내가 염려하는 점은이 솔루션에 안전하지 않은 코드 블록 (포인터 포함)이 있다는 사실입니다. 처음에는 오류가 있었지만 web.config에 안전하지 않은 컴파일러 옵션을 추가하여이를 수정했습니다. – tkahn

+0

@tkahn ASP.NET 컨텍스트에서 안전하지 않은 것이 문제 일 수 있습니다. 해결 방법은 비트 맵에서 GetPixel/SetPixel을 사용하여 알파 채널을 대신 ​​전송하는 것이지만 훨씬 느려질 수 있습니다. –