سؤال

وكتبت طريقة لقص الصور في C #. وهو يفعل ذلك من خلال خلق صورة نقطية جديدة ورسم على ذلك المستطيل المحدد (المنطقة المراد اقتصاص) من الصورة الأصلية.

لالصور لقد حاولت مع انها تولد نتائج خاطئة. وكان حجم الصورة الناتجة الصحيح، ولكن محتوى ذلك. كان عليه إذا كان قد تم تحجيم الصورة بنسبة 2 ثم اقتصاص. في نهاية المطاف مضيفا هذا الخط ثابتة فيه:

result.setResolution(72, 72)

ولكن لماذا أحتاج إلى قرار؟ أنا فقط العمل مع بكسل، أبدا مع بوصة أو سم. أيضا، فإن ما ثم يكون القرار الصحيح؟

والرمز الكامل هو هذه الطريقة التمديد:

public static Bitmap Crop(this Image image, int x, int y, int width, int height) {
    Bitmap result = new Bitmap(width, height);
    result.SetResolution(72, 72);

    // Use a graphics object to draw the resized image into the bitmap.
    using (Graphics graphics = Graphics.FromImage(result)) {
        // High quality.
        graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        // Draw the image into the target bitmap.
        graphics.DrawImage(image, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
    }

    return result;
}
هل كانت مفيدة؟

المحلول

وأنت تستخدم الزائد غير صحيح DrawImage. يجب أن تكون باستخدام واحد حيث يمكنك تحديد rects SRC والوجهة.

graphics.DrawImage(image, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);

وحاول أن واسمحوا لي أن أعرف في التعليقات إذا كان لا يعمل.

نصائح أخرى

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

وبالتالي أنا أعتقد أن هذا هو الضرب البسيط تليها memcopy.

وبالنسبة

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