PDA

View Full Version : خطا:A generic error occurred in GDI+.



f montazeri
چهارشنبه 04 خرداد 1390, 18:32 عصر
.
ExternalException was unhandled
A generic error occurred in GDI+.

سلام دوستان این خطا برای چی ظاهر می شود ؟؟
می خواهم متن به عکس تبدیل کنم این خطا می آید و از این خط خطا می گیرد (****)

Bitmap img = newBitmap(200,200);
Graphics g = Graphics.FromImage(img);
g.Clear(Color.White);
g.DrawString(textBox1.Text+textBox2.Text, newFont("tohoma", 16, FontStyle.Regular), newSolidBrush(Color.Black), newPointF(0.5f,2.0f));
******************
img.Save(("D:\\برنامه های C#‎\\remove\\remove\\iamge\\z.jpeg"),ImageFormat.Jpeg);

لطفا بگین چیکار کنم فوری فوری هست
ممنون

Felony
چهارشنبه 04 خرداد 1390, 19:10 عصر
کد مشکلی نداره .

mehdi.mousavi
یک شنبه 01 آبان 1390, 11:41 صبح
سلام.
وقتی Image یا Bitmap ای از روی فایل لود میشه، اون فایل در طول lifetime اون object قفل میشه. در نتیجه، متود Save باعث میشه تا کلاس Image خطای مورد نظری که شما بهش اشاره کردید رو throw کنه. برای بررسی این مساله می تونید کدتون رو بدین شکل تغییر بدید:


string filename = "d:\\temp.jpg";
Bitmap img = new Bitmap(filename);
Graphics g = Graphics.FromImage(img);
g.Clear(Color.White);
g.DrawString("Whatever Text", new Font("tohoma", 16, FontStyle.Regular), new SolidBrush(Color.Black), new PointF(0.5f, 2.0f));

img.Save(filename, ImageFormat.Jpeg);

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

string filename = "d:\\temp.jpg";
using (Bitmap img = new Bitmap(200, 200))
{
using (Graphics g = Graphics.FromImage(img))
{
g.Clear(Color.White);
using (Font font = new Font("tohoma", 16, FontStyle.Regular))
{
g.DrawString("Whatever Text", font, Brushes.Black, new PointF(0.5f, 2.0f));
}

img.Save(filename, ImageFormat.Jpeg);
}
}


همونطوریکه میبینید، کلیه کلاسهای Disposable رو Dispose کرده ام. این کار باعث میشه تا Resource های گرفته شده از GDI+ به اون دوباره برگردونده بشه (و در نتیجه بیتهای تصویر، یا فایل، Lock شده باقی نمونه). ضمن اینکه، شما نیازی به new کردن یک SolidBrush فقط به صرف استفاده از یک رنگ خاص ندارید و میتونید همونطوری که در کد فوق نشون داده شده، از Brushes.Black برای این منظور استفاده کنید. قاعدتا این تغییرات رو بدید، دیگه نباید با اون خطا مواجه بشید. (البته حالت های دیگه ای هم مثل Transform کردن تصویر، Scale کردن اون و ... وجود داره که ممکنه باعث بروز همین خطا بشه، اما چون کد شما چنین چیزی رو نشون نمیده، وارد اون حیطه ها نمیشم).

موفق باشید.