البرمجة

تحجيم الصور في تطبيقات UWP باستخدام C# ومكتبة BitmapDecoder

فيما يبدو، قد قدمت لنا تقنية تكبير الصور باستخدام لغة البرمجة C# ومكتبة Universal Windows Platform (UWP). الهدف هو تغيير حجم صورة من نوع JPEG وتخزينها في مصفوفة بايت جديدة. ومع ذلك، تواجه بعض الصعوبات في الحصول على النتيجة المتوقعة.

أولًا، يجدر بنا فحص الكود الذي قدمته بعناية. يظهر أن الجزء الرئيسي من الكود هو داخل الدالة ResizeImage. تقوم هذه الدالة بتحميل الصورة من مصفوفة البايتات، ثم تقوم بتحويلها باستخدام BitmapDecoder وتقوم بتغيير حجم الصورة باستخدام BitmapEncoder، وأخيرًا، تقوم بإرجاع الصورة المعالجة كمصفوفة بايت جديدة.

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

لحل هذه المشكلة، يُفضل أن تقوم بضبط موضع القراءة في resizedStream بعد عملية الكتابة، يمكنك استخدام resizedStream.Seek(0); بعد السطر الذي يلي await resizedStream.WriteAsync(outBuffer.AsBuffer());.

كما أنه يُفضل أيضًا التحقق من قيمة x المُرجعة من الدالة WriteAsync للتأكد من أن عملية الكتابة تمت بنجاح.

بعد تحديد المشكلة وتطبيق التعديلات، يجب أن تكون قادرًا على الحصول على الصورة المصغرة المقصودة بشكل صحيح.

المزيد من المعلومات

إضافة إلى الإصلاحات المقترحة للكود، يمكننا التعمق قليلاً في بعض الجوانب الفنية لتوضيح العمليات التي يقوم بها الكود.

أولًا وقبل كل شيء، يتم استخدام BitmapDecoder لفهم الصورة الأصلية الموجودة في مصفوفة البايت. يتم ذلك عن طريق إنشاء BitmapDecoder باستخدام BitmapDecoder.CreateAsync(imageStream) حيث يقوم بفهم الترميز وتحليل الصورة.

ثم يتم استخدام BitmapEncoder لإعادة تشفير الصورة بحجم جديد. تمثل هذه الخطوة في إنشاء BitmapEncoder باستخدام BitmapEncoder.CreateForTranscodingAsync(resizedStream, decoder) حيث يتم تحديد resizedStream كوجهة للكتابة ويتم استخدام decoder كمصدر لفهم الصورة الأصلية.

بعد ذلك، يتم حساب نسبة التحجيم (scaleRatio) باستخدام عرض الصورة وارتفاعها الأصليين والأبعاد المطلوبة (reqWidth و reqHeight). يتم استخدام هذه النسبة لتحديد الأبعاد الجديدة (aspectHeight و aspectWidth) بحيث تكون متناسبة مع النسبة المحسوبة.

يتم ضبط BitmapTransform لديكودر بواسطة encoder.BitmapTransform لتحقيق هذا التحجيم، وتُعين خاصية InterpolationMode على BitmapInterpolationMode.Linear لتحسين جودة الصورة المتحجمة.

أخيرًا، يتم كتابة الصورة المحجومة إلى resizedStream، وبعد ذلك يتم إعادة تعيين مؤشر القراءة في البداية باستخدام resizedStream.Seek(0)، ثم تكون البيانات الناتجة متاحة في outBuffer.

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

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!