2015-03-02 2 views
1

Я пытаюсь преобразовать содержимое текстового файла в изображение с помощью C#, но я не могу это сделать. Я получаю раздражающую ошибку A generic error occurred in GDI+. от System.Drawing.Сохранение содержимого текстового файла как изображения

Вот мой фактический код:

public static Bitmap ConvertTextToImage(string txt, string fontname, int fontsize, Color bgcolor, Color fcolor, int width, int Height) 
{ 
    Bitmap bmp = new Bitmap(width, Height); 
    using (Graphics graphics = Graphics.FromImage(bmp)) 
    { 
     Font font = new Font(fontname, fontsize); 
     graphics.FillRectangle(new SolidBrush(bgcolor), 0, 0, bmp.Width, bmp.Height); 
     graphics.DrawString(txt, font, new SolidBrush(fcolor), 0, 0); 
     graphics.Flush(); 
     font.Dispose(); 
     graphics.Dispose(); 
    } 
    bmp.Save("C:\\" + Guid.NewGuid().ToString() + ".bmp"); 
    Convert(bmp); 
    return bmp; 
} 

Таким образом, на линии bmp.Save("C:\\" + Guid.NewGuid().ToString() + ".bmp"); при попытке сохранить изображение, он приносит эту ошибку. Я читал сообщения и подобные вопросы и завернул все вокруг инструкции using, как это было предложено в нескольких источниках, но я все еще ничего не вижу и не могу понять.

Я использую File.ReadAllText(path); прочитать содержимое текстового файла, а затем я сделать обычный вызов к моему методу:

ConvertTextToImage(content, "Bookman Old Style", 10, Color.White, Color.Black, width, height); 
+1

Возможно, вы получите эту ошибку из-за попытки сохранить в корневой каталог C :. Попробуйте изменить путь к файлу в методе Save() на что-то вроде C: \ Temp \ .bmp. Это связано с разрешением/UAC, которое не позволяет писать напрямую в корневой каталог –

+0

Я пробовал это, но у меня по-прежнему появляется такая же общая ошибка ... Я также попытался сохранить в текущий каталог проекта то же самое. Я думаю, что здесь не причина. – lapadets

+0

Я только что проверил ваш код. Запись в C: \ throws общая ошибка, запись в C: \ Temp \ прошла успешно. Ваш код работает так, как есть. –

ответ

0

Благодаря UAC, ваши получают общую ошибку, потому что вы пытаетесь записать в корневой каталог C: диск, который не разрешен в ОС Windows ,

Изменение линии

bmp.Save("C:\\" + Guid.NewGuid().ToString() + ".bmp"); 

в

bmp.Save("C:\\Temp\\" + Guid.NewGuid().ToString() + ".bmp"); 

(или любую другую папку, что у вас есть права доступа к), позволяет успешно создавать изображения.

+0

Да, оказывается, мне нужно было запустить VS в качестве администратора ...Я попробовал записать в другую папку на 'C: \', но это тоже не сработало, поэтому я сначала отказался от идеи прав. – lapadets

+0

Я бы посоветовал использовать VS в качестве администратора. Скорее напишите в папку AppData для временного хранения или другую предварительно определенную папку, в зависимости от того, что приложение делает с изображением. У ваших пользователей могут не всегда быть права на запуск приложения в качестве администратора –

3

Итак, вы Dispose() ING вашего Graphics объекта дважды. Однажды через вашу строку, которая говорит graphics.Dispose(), и как только это будет сделано автоматически через конструкцию using. Вы должны быть хорошо с методом, написанным как таковой:

public static Bitmap ConvertTextToImage(string txt, string fontname, int fontsize, Color bgcolor, Color fcolor, int width, int Height) 
{ 
    var bmp = new Bitmap(width, Height); 

    using (var graphics = Graphics.FromImage(bmp)) 
    using (var font = new Font(fontname, fontsize)) 
    { 
     graphics.FillRectangle(new SolidBrush(bgcolor), 0, 0, bmp.Width, bmp.Height); 
     graphics.DrawString(txt, font, new SolidBrush(fcolor), 0, 0); 
    } 

    bmp.Save("C:\\" + Guid.NewGuid() + ".bmp"); 
    Convert(bmp); 
    return bmp; 
} 
+1

кажется, что ваше изменение не касается исходной ошибки? – swe

+0

Я не получаю ошибку с моими изменениями. –

+0

, но двойное распоряжение не должно заканчиваться ошибкой, особенно не в GDI + -Error? Тогда это будет NullRef ... – swe

0

Я думаю, что у вашего приложения нет разрешения на запись файлов на C: /. A изменили ваш код, и это работает для меня:

bmp.Save(Guid.NewGuid().ToString() + ".bmp"); 

Он сохранит изображение в папке вашего приложения.

Кроме того, вам не нужно звонить graphics.Dispose();, потому что using делает это за вас.

Смежные вопросы