نمایش نتایج 1 تا 12 از 12

نام تاپیک: خطا در تبدیل image به byte

  1. #1

    خطا در تبدیل image به byte

    سلام
    این تابعو برا تبدیل image به byte[] نوشتم

    public byte[] imageToByteArray(System.Drawing.Image imageIn, System.Drawing.Imaging.ImageFormat ImgFormat)
    {
    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
    {
    imageIn.Save(ms, ImgFormat);
    return ms.ToArray();
    }
    }


    حالا تو خط image in.save این خطا رو میده
    A generic error occurred in GDI+.


    لطفا راهنمایی کنین

  2. #2
    کاربر دائمی آواتار __H2__
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    یک جایی بین Framework و نارمک!
    پست
    1,059

    نقل قول: خطا در تبدیل image به byte

    سلام
    مشکل در جایی است که imageIn را نمونه سازی کرده اید.
    در صورت عدم حل مشکل دستورات محل پر شدن و نمونه سازی imageIn را قرار دهید.
    موفق باشید.

  3. #3

    نقل قول: خطا در تبدیل image به byte

    خب من یه pictuerBox دارم که imagein رو اینطوری پر میکنم
    imagein = pic1.Image;

    این pictuerBoxهم از دو طریق پر میشه
    یه دکمه بارگذاری داری و عکس رو با یک openfiledialog باز میکنم و میارم تو pictuerBox نشون میدم
    روش دوم اینه که از طریق دریتا بیس پرش میکنم

    وقتی از روش اول بارگذاری میشه مشکلی نداره ولی وقتی از روش دوم عکسو بارگذاری میکنم مشکل پیش میاد

  4. #4
    کاربر دائمی آواتار __H2__
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    یک جایی بین Framework و نارمک!
    پست
    1,059

    نقل قول: خطا در تبدیل image به byte

    سلام
    همانطور که گفتم منظورم محل نمونه سازی و ساخته شدن بوده است.
    اگر هم دقت کنید میبینید که با یک روش که تصویر را پر میکنید مشکلی ندارید ولی در روش دیگر مشکل رخ میدهد، این تایید کننده همان نکته است که خدمت تان عرض کردم، مشکل از محل تولید است.
    شما کدهای پر کردن تصویر از روش دوم تان را اینجا قرار دهید.

    مثلاً خطای رایجی که الآن به ذهنم میرسد آن است که زمان ساخت تصویر هم طبیعتاً یک stream استفاده کرده اید؟! احیناً احتمالاً بعد از ساخت تصویر Dispose اش که نکرده اید؟؟؟

  5. #5

    نقل قول: خطا در تبدیل image به byte

    از دیتابیس میخونم بعد با یک تابع تبدیل به image میکنم بعد pictuerbox رو پر میکنم
    اینم تابع


    public System.Drawing.Image byteArrayToImage(byte[] byteArrayIn)
    {
    using (System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArrayIn))
    {
    return System.Drawing.Image.FromStream(ms);
    }
    }

  6. #6
    کاربر دائمی آواتار __H2__
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    یک جایی بین Framework و نارمک!
    پست
    1,059

    نقل قول: خطا در تبدیل image به byte

    سلام
    چه حدس جالبی... حدس میزنم مشکل همان است.
    این کد را امتحان کنید:

    public System.Drawing.Image byteArrayToImage(byte[] byteArrayIn)
    {
    var ms = new System.IO.MemoryStream(byteArrayIn);
    return System.Drawing.Image.FromStream(ms);
    }

    البته امیدوارم که این باعث نشود که در استفاده از using مردد شوید، استفاده از این دستور بسیار عادت خوب و مفیدی است ولی اینجا بهتر است استفاده نشود.

  7. #7

    نقل قول: خطا در تبدیل image به byte

    اره درست شد
    ولی خب چرا؟
    میشه دلیل این خطا رو بگید
    خب فک کنید من تعداد زیادی عکسو اینطوری تبدیل کنم نمیخواد منابع مربوط به memoryStream اونها ازاد بشن؟

  8. #8
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: خطا در تبدیل image به byte

    نقل قول نوشته شده توسط __H2__ مشاهده تاپیک
    سلام
    چه حدس جالبی... حدس میزنم مشکل همان است.
    این کد را امتحان کنید:

    public System.Drawing.Image byteArrayToImage(byte[] byteArrayIn)
    {
    var ms = new System.IO.MemoryStream(byteArrayIn);
    return System.Drawing.Image.FromStream(ms);
    }

    البته امیدوارم که این باعث نشود که در استفاده از using مردد شوید، استفاده از این دستور بسیار عادت خوب و مفیدی است ولی اینجا بهتر است استفاده نشود.
    خیلی بعیده که خطای دوستمون مربوط به این قضیه باشه.من همیشه بعد از لود تصویر از هر Stream ی، چه MemoryStream چه FileStream، اون Stream رو میبندم و مشکلی پیش نمیاد.منطقا هم بعد از اینکه تصویر لود بشه اون تصویر هیچ وابستگی ای به Stream نداره.

  9. #9
    کاربر تازه وارد آواتار Hadoop
    تاریخ عضویت
    خرداد 1393
    پست
    51

    نقل قول: خطا در تبدیل image به byte

    using(var memoryStream = new MemoryStream())
    {
    sourceStream.CopyTo(memoryStream);
    return memoryStream.ToArray();
    }

  10. #10
    کاربر دائمی آواتار __H2__
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    یک جایی بین Framework و نارمک!
    پست
    1,059

    نقل قول: خطا در تبدیل image به byte

    سلام
    ولی خب چرا؟
    بنظر میرسد فرآیند ذخیره سازی نیاز به اطلاعات اضافه از منبع اولیه دارد و اگر این منبع Dispose شده باشد فرآیند مذکور به خطا خواهد خورد.

    خب فک کنید من تعداد زیادی عکسو اینطوری تبدیل کنم نمیخواد منابع مربوط به memoryStream اونها ازاد بشن؟
    بطور خاص منبع کلاس MemoryStream یک آرایه باینری است و با Close و Dispose آزاد سازی نمیشود.
    آزاد سازی واقعی این کلاس فقط توسط جمع آوری کننده حافظه هرز دات نت رخ خواهد داد و تا وقتی اشاره گری به MemoryStream وجود دارد آزاد سازی واقعی رخ نخواهد داد در این کلاس خاص شما فقط با Dispose ورودی خروجی و دسترسی و... را خواهید بست ولی فضای RAM تا null شدن تمام اشاره گر ها باقی خواهد ماند.
    دقت کنید که در هر شرایطی حداقل اشاره گری به این کلاس درون کلاس تصویر وجود خواهد داشت و زنده خواهد ماند!

    خیلی بعیده که خطای دوستمون مربوط به این قضیه باشه.من همیشه بعد از لود تصویر از هر Stream ی، چه MemoryStream چه FileStream، اون Stream رو میبندم و مشکلی پیش نمیاد
    و دستور Save هم استفاده کرده اید؟! امتحانش ضرر ندارد!

    موفق باشید.

  11. #11

    نقل قول: خطا در تبدیل image به byte

    سلام.
    آیا به این مساله دقت کرده اید که کلاس Image، در واقع یک abstract class هستش؟ پس Image.FromStream چطوری میتونه یک Image برگردونه، در حالیکه Image فقط یک abstract class ای هستش که نمیشه Instantiate اش کرد؟ خوب، واضحه. فقط در یک صورت چنین امکانی وجود داره و اونم این هستش که متود مزبور حتما داره Instance ای از کلاسی میسازه که از Image درایو شده که فقط در این صورت هستش که میتونه مقدار بازگشی رو به Image کست کنه و اونو از طریق FromStream برگردونه. حالا سوال تغییر میکنه: "این چه کلاسی هستش که FromStream درون خودش Instantiate میکنه و با استفاده از اون Image رو به ما برمیگردونه؟"

    این کلاس، کلاس Bitmap هستش. کلاسی که از Image درایو شده، و در درون Image.FromStream در حقیقت داره Instantiate میشه. در حقیقت در کلاس Image، متودی با Signature زیر وجود داره که این کارو در درون خودش انجام میده:

    internal static Image CreateImageObject(IntPtr nativeImage);


    در درون این متود، جایی Bitmap.FromGDIplus فراخوانی میشه، متودی که Instance ای از کلاس Bitmap (بر اساس native image ای که بعنوان formal parameter بهش داده شده) میسازه. اما دونستن این مطالب چه کمکی به دلیل پی بردن به اون خطا میکنه؟ پاسخ اینجاست که اگر به مستندات کلاس Bitmap توجه کنید، اولین خط در بخش Remark نوشته شده که "شما باید stream را در طول حیات Bitmap، باز نگه دارید". درسته شده دارید یک Image Instance از متود Image.FromStream میگیرید، اما اون Instance توسط Bitmap.FromGDIplus ایجاد میشه و Bitmap کلاسی هستش که داره Instantiate میشه. در حقیقت اینجا شما دارید "مالکیت" اون stream ر به Bitmap واگذار می کنید، پس اجازه ندارید تا مادامیکه کلاس Bitmap در حافظه هستش اون Stream رو از بین ببریبد. حالا با این توضیحات، میتونیم به این سوال شما پاسخ بدیم:

    خب فک کنید من تعداد زیادی عکسو اینطوری تبدیل کنم نمیخواد منابع مربوط به memoryStream اونها ازاد بشن؟
    کافیه تا Image دریافت شده رو Dispose کنید. بدین ترتیب Image به نوبه خودش Stream مربوطه رو آزاد خواهد کرد. (چون باز هم تکرار میکنم، مالکیت Stream در حال حاضر در اختیار Image قرار گرفته).

    موفق باشید.

  12. #12
    کاربر دائمی
    تاریخ عضویت
    دی 1383
    محل زندگی
    اصفهان
    پست
    1,436

    نقل قول: خطا در تبدیل image به byte

    نقل قول نوشته شده توسط __H2__ مشاهده تاپیک
    و دستور Save هم استفاده کرده اید؟! امتحانش ضرر ندارد!
    موفق باشید.
    جالبه، شما درست میگین...هرچند این رفتار Image بنظر مسخره میاد...

تاپیک های مشابه

  1. تبدیل image به byte[]
    نوشته شده توسط shirin_h در بخش C#‎‎
    پاسخ: 9
    آخرین پست: پنج شنبه 10 مهر 1393, 11:49 صبح
  2. سوال: خطا در تبدیل عکس به byte و وراد کردن آن در بانک اطلاعاتی
    نوشته شده توسط amin_sltny در بخش C#‎‎
    پاسخ: 0
    آخرین پست: یک شنبه 21 اسفند 1390, 12:24 عصر
  3. تبدیل Bitmap به [] byte
    نوشته شده توسط tthenry14plus در بخش C#‎‎
    پاسخ: 8
    آخرین پست: دوشنبه 19 فروردین 1387, 07:37 صبح
  4. تبدیل Image به Byte[]
    نوشته شده توسط once4ever در بخش C#‎‎
    پاسخ: 3
    آخرین پست: یک شنبه 06 خرداد 1386, 09:11 صبح
  5. خطا در تبدیل varchar به bigint
    نوشته شده توسط DataMaster در بخش SQL Server
    پاسخ: 1
    آخرین پست: چهارشنبه 01 آذر 1385, 22:34 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •