تحجيم الصور في تطبيقات UWP باستخدام C# ومكتبة BitmapDecoder
فيما يبدو، قد قدمت لنا تقنية تكبير الصور باستخدام لغة البرمجة C# ومكتبة Universal Windows Platform (UWP). الهدف هو تغيير حجم صورة من نوع JPEG وتخزينها في مصفوفة بايت جديدة. ومع ذلك، تواجه بعض الصعوبات في الحصول على النتيجة المتوقعة.
أولًا، يجدر بنا فحص الكود الذي قدمته بعناية. يظهر أن الجزء الرئيسي من الكود هو داخل الدالة ResizeImage
. تقوم هذه الدالة بتحميل الصورة من مصفوفة البايتات، ثم تقوم بتحويلها باستخدام BitmapDecoder
وتقوم بتغيير حجم الصورة باستخدام BitmapEncoder
، وأخيرًا، تقوم بإرجاع الصورة المعالجة كمصفوفة بايت جديدة.
-
تحميل ملفات الصور باستخدام AJAX04/03/2024
-
تحسين شروط التحقق في البرمجة02/04/2024
ومع ذلك، تواجه مشكلة فيما يبدو أثناء كتابة النتيجة إلى 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
.
باختصار، الكود يعمل على تحميل صورة، تغيير حجمها بناءً على الأبعاد المطلوبة، وثم كتابة الصورة المحجومة إلى مصفوفة بايت جديدة. باستخدام الإصلاحات المقترحة، يجب أن تتمكن من الحصول على النتيجة المرجوة بشكل صحيح.