كيفية تقديم صور عالية الدقة في نموذج منخفض الدقة باستخدام C #

StackOverflow https://stackoverflow.com/questions/754168

سؤال

محاولة استخدام صور TIF 300DPI لعرضها على الويب. في الوقت الحالي، عند تحميل المستخدم صورة، أقوم بإنشاء صورة مصغرة بشكل حيوي. إذا تم إنشاء صفحة مرجعية صورة عالية الدقة مع عرض 500x500px، هل يمكنني استخدام نفس الوظيفة للتحويل إلى GIF / JPG على الطاير. ما هو الحل الوشيئي ل JPG الذي سيتم إنشاؤه؟

تعديل:

لتعزيز الاستخدام، يقوم المستخدم بتحميل الصور 300DPI تقريبا 3000 × 3000 بكسل. يستخدم المستخدم هذه الصور لإنشاء صفحة كتالوج سيتم استخدامها لطباعة PDF. عندما يقومون بإنشاء الصفحة، نحتاج فقط إلى 72 نقطة في البوصة لعرضها على الشاشة، ولكن بالنسبة للطباعة، تحتاج إلى صور 300 نقطة في البوصة. من الواضح أنهم لا يريدون إضافة صورة 3000 × 3000 بكسل إلى الصفحة، لذلك يحتاج إلى تغيير حجمها إلى منطقة المشاهدة الصحيحة، على سبيل المثال 500x500px إلخ.

هل كانت مفيدة؟

المحلول

هذا يتلخص إلى تغيير حجم الصورة البسيطة. مناقشة DPIS هي بيانات مساعدة فقط لحساب عامل المقياس.

كما قال guffa، يجب عليك القيام بذلك في وقت التحميل حتى تتمكن من تقديم الصور الثابتة فقط في المشاهد الخاص بك.

سيكون هذا تحميلا على الخادم:

  1. تحميل الصورة كاملة. سيكون هذا حوالي 27 ميغابايت من الذاكرة لصور 3000x3000 الخاصة بك.
  2. تغيير الحجم. الكثير من الرياضيات القيام به بتكاسل (لا يزال cpu مكثفة).
  3. ضغط. المزيد من وحدة المعالجة المركزية + تكلفة الكتابة إلى محرك الأقراص الخاص بك.

نظرا لأنك تأخذ بالفعل الوقت الكافي لتوليد صورة مصغرة، يمكنك إطفاء هذه التكلفة والتكلفة هذه من خلال عدم الاضطرار إلى تكرار الخطوة 1 أعلاه (انظر الكود).

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

هنا هو بعض التعليمات البرمجية للقيام بهذه المهمة. الخطوط الهامة هي هذه:

OutputAsJpeg(Resize(big, 300.0, 72.0), new FileStream("ScreenView.jpg"));
OutputAsJpeg(Resize(big, bigSize, 64.0), new FileStream("Thumbnail.jpg"));

يمكننا تغيير حجم big ولكننا نحتاج. في السطر الأول، ندرجه فقط بمقياس ثابت (72.0 / 300.0). في السطر الثاني، نحن نفرض الصورة على البعد الأقصى النهائي من 64 (عامل مقياس = 64.0 / 3000.0).

using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.IO;

BitmapSource Resize(BitmapSource original,
                    double originalScale,
                    double newScale) {
    double s = newScale / originalScale;
    return new TransformedBitmap(original, new ScaleTransform(s, s));
}

void OutputAsJpeg(BitmapSource src, Stream out) {
    var encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(src));
    encoder.Save(out);
}

// Load up your bitmap from the file system or whatever,
// then dump it out to a smaller version and a thumbnail.
// Assumes thumbnails have a max dimension of 64
BitmapSource big = new BitmapImage(new Uri("BigPage0.png",
                                           UriKind. RelativeOrAbsolute));
double bigSize = Math.Max(big.PixelWidth, big.PixelHeight);
OutputAsJpeg(Resize(big, 300.0, 72.0), new FileStream("ScreenView.jpg"));
OutputAsJpeg(Resize(big, bigSize, 64.0), new FileStream("Thumbnail.jpg"));

نصائح أخرى

إذا فهمت ما تريد - أنت تحاول إنشاء صورة مصغرة GIF أو JPG من TIF عالية الدقة للغاية، لعرض الويب - إن لم يكن، أعتذر مقدما ....


إذا كنت ترغب في أن تكون الصورة المصغرة 500x500px، فهذا هو حل JPG / GIF ترغب في إنشاء - 500x500، أو ما لا يقل عن 500x <500 أو <500x500 (لتناسب في المربع، إلا إذا كنت تريد صور مشوهة).

لعرضه على الويب، لا يهم DPI. ما عليك سوى استخدام الدقة بكسل ترغب مباشرة.

من الناحية الفنية يتم إنشاء JPG / GIF في 72-DPI بواسطة فئات الصور في .NET. لكن DPI حقا ليس لديه أي معنى للمتصفح - يستخدم فقط الأبعاد 500x500.

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

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

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