هل يمكنني الحصول على البايت [] من BitmapImage في Silverlight؟

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

سؤال

أحاول اجتياز بعض تمثيل صورة جيئة وذهابا بين Silverlight وخدمة WCF. إذا كان ذلك ممكنا، أود اجتياز System.Windows.Media.Imaging.BitmapImage, ، نظرا لأن هذا يعني أن العميل لا يلزم القيام بأي تحويل.

ومع ذلك، في مرحلة ما أحتاج إلى تخزين هذه الصورة في قاعدة بيانات، مما يعني أن تمثيل الصورة يجب أن يكون قادرا على التحويل من وإلى byte[]. وبعد يمكنني إنشاء BitmapImage من byte[] من خلال قراءة الصفيف في MemoryStream واستخدام BitmapImage.SetSource(). وبعد لكنني لا أستطيع أن أجد طريقة لتحويل الأداة الأخرى - من BitmapImage ل byte[]. وبعد هل أفتقد شيئا واضحا هنا؟

إذا كان ذلك يساعد على الإطلاق، فقد يعمل رمز التحويل على الخادم، أي أنه لا يحتاج إلى أن تكون آمنة من Silverlight.

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

المحلول

استخدم هذا:

public byte[] GetBytes(BitmapImage bi)
{
    WriteableBitmap wbm = new WriteableBitmap(bi);
    return wbm.ToByteArray();
}

أين

public static byte[] ToByteArray(this WriteableBitmap bmp)
{
    // Init buffer
    int w = bmp.PixelWidth;
    int h = bmp.PixelHeight;
    int[] p = bmp.Pixels;
    int len = p.Length;
    byte[] result = new byte[4 * w * h];

    // Copy pixels to buffer
    for (int i = 0, j = 0; i < len; i++, j += 4)
    {
        int color = p[i];
        result[j + 0] = (byte)(color >> 24); // A
        result[j + 1] = (byte)(color >> 16); // R
        result[j + 2] = (byte)(color >> 8);  // G
        result[j + 3] = (byte)(color);       // B
    }

    return result;
}

نصائح أخرى

كان لي نفس القضية. لقد وجدت مكتبة Imagetools هذا يجعل طريقة العمل thte أسهل.

الحصول على المكتبة والرجوع إليها ثم

                        using (var writingStream = new MemoryStream())
                        {
                            var encoder = new PngEncoder
                            {
                                IsWritingUncompressed = false
                            };
                            encoder.Encode(bitmapImageInstance, writingStream);
                            // do something with the array
                        }

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

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