سؤال

وأريد أن تغيير حجم صورة مع مكتبة GDI حتى أنني عندما حجمه لتكون أكبر من ذي قبل ليس هناك مزج. (مثل عند تكبير صورة في برنامج الرسام)

وعلى سبيل المثال: إذا كانت الصورة نظري هو 2px واسعة، وطويل القامة 2px
(أبيض، أبيض،
أبيض وأسود)
، وأنا حجمه لتكون أكبر بنسبة 100٪، وذلك 4PX ب 4px طويل القامة
(أبيض، أبيض، أبيض، أبيض،
أبيض، أبيض، أبيض، أبيض،
أبيض، أبيض، أسود، أسود،
أبيض، أبيض، أسود، أسود)

وماذا InterpolationMode أو وضع (أو غيرها من الممتلكات) لكائن الرسومات يمكنني استخدامها لتحقيق هذا تمهيد؟ المجموعات التي حاولت حتى الآن كل يسبب الرمادي لتظهر في صورة الاختبار.

وهنا هو رمز بأنني أستخدم

    /// <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.Half. تغيير حالة جودة غير عالية ل:

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

نصائح أخرى

وعندما كنت رسم صورة وتمرير في مستطيل المصدر، وتمرير فقط في الجزء التكبير في الصورة الأصلية ورسم ذلك إلى مساحة أكبر. عندما الأزيز المستخدم في، في مرحلة ما فإنها لن تكون قادرا على رؤية الصورة بأكملها في منطقة المشاهدة. لذا، معرفة أي منطقة المصدر ينبغي أن يكون لا يزال في نظر وطلاء ذلك فحسب.

وانها لا تبدو وكأنك تفعل شيئا خاطئا بالنسبة لي. اطلع على تعليمات من Microsoft على InterpolationMode:

<أ href = على "HTTP : //msdn.microsoft.com/en-us/library/ms533836 (VS.85) .aspx اتصال "يختلط =" نوفولو noreferrer "> http://msdn.microsoft.com/en-us/library/ms533836 (VS 0.85) .aspx اتصال

وربما هذه الوظيفة ويعمل بشكل ممتاز، ولكن كنت يعطيها المعلمات خاطئة أو تعرض نتيجة غير صحيح؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top