문제

GDI 라이브러리로 이미지를 크기를 조정하여 블렌딩이 없기 전보다 크게 크기를 조정하고 싶습니다. (페인트 프로그램에서 이미지를 확대 할 때와 같이)

예 : 내 이미지가 폭 2px이고 키가 2px 인 경우
(흰색, 흰색,
흰색, 검은 색)
그리고 나는 그것을 100% 더 크게 크기로, 4px x 4px입니다.
(흰색, 흰색, 흰색, 흰색,
흰색, 흰색, 흰색, 흰색,
흰색, 흰색, 검은 색, 검은 색,
흰색, 흰색, 검은 색, 검은 색)

그래픽 객체의 보간 모드 또는 스무딩 모드 (또는 기타 속성)는이를 달성하는 데 사용할 수 있습니까? 지금까지 시도한 조합은 모두 테스트 이미지에 회색이 나타납니다.

여기에 사용중인 코드가 있습니다

    /// <summary>
    /// Do the resize using GDI+
    /// Credit to the original author
    /// http://www.bryanrobson.net/dnn/Code/Imageresizing/tabid/69/Default.aspx
    /// </summary>
    /// <param name="srcBitmap">The source bitmap to be resized</param>
    /// <param name="width">The target width</param>
    /// <param name="height">The target height</param>
    /// <param name="isHighQuality">Shoule the resize be done at high quality?</param>
    /// <returns>The resized Bitmap</returns>

    public static Bitmap Resize(Bitmap srcBitmap, int width, int height, bool isHighQuality)
    {
        // Create the destination Bitmap, and set its resolution
        Bitmap destBitmap = new Bitmap((int)Convert.ToInt32(width), (int)Convert.ToInt32(height), PixelFormat.Format24bppRgb);
        destBitmap.SetResolution(srcBitmap.HorizontalResolution, srcBitmap.VerticalResolution);

        // Create a Graphics object from the destination Bitmap, and set the quality
        Graphics grPhoto = Graphics.FromImage(destBitmap);
        if (isHighQuality)
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
        }
        else
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; //? this doesn't work
            grPhoto.InterpolationMode = InterpolationMode.NearestNeighbor; //? this doesn't work


        }
        // Do the resize
        grPhoto.DrawImage(srcBitmap,
              new Rectangle(0, 0, width, height),
              new Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height),
              GraphicsUnit.Pixel);

        grPhoto.Dispose();
        return destBitmap;
    }
도움이 되었습니까?

해결책

당신은 interpolationmode.nearestneighbor를 사용하여 올바른 길을 가고있었습니다. 그러나 기본 PixelOffSetMode를 사용하면 GDI+가 픽셀 가장자리에서 샘플링하여 블렌딩을 유발합니다.

블렌딩없이 스케일링을 얻으려면 PixelOffSetMode.hall을 사용해야합니다. 비 높은 품질의 사례를 다음으로 변경하십시오.

else
{
    grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
}

다른 팁

이미지를 그리고 소스 사각형을 전달할 때 원래 이미지의 확대 된 부분 만 통과하여 더 큰 영역으로 그립니다. 사용자가 확대되면 어느 시점에서 시청 영역에서 전체 이미지를 볼 수 없습니다. 따라서 어떤 소스 영역이 여전히보아야하는지 파악하고 그 일만 페인트하십시오.

당신이 나에게 잘못을하고있는 것처럼 보이지 않습니다. 보간 모드에서 Microsoft의 지침을 참조하십시오.

http://msdn.microsoft.com/en-us/library/ms533836(vs.85).aspx

어쩌면이 기능이 완벽하게 작동하지만 잘못된 매개 변수를 제공하거나 결과를 잘못 표시하고 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top