#c# #asp.net
#c# #asp.net
Вопрос:
Я пытаюсь сохранить изображение с помощью System.Рисование.Save() и я продолжаю получать недопустимое исключение параметра.
Может кто-нибудь, пожалуйста, взглянуть на мой код и сказать мне, что я делаю не так.
Вот код, который генерирует изображение штрих-кода.
public class BarcodeHelper
{
Font barcodeFont;
public BarcodeHelper()
{
PrivateFontCollection fonts;
FontFamily family = LoadFontFamily("~/../fonts/Code128bWin.ttf", out fonts);
barcodeFont = new Font(family, 20.0f);
// when done:
barcodeFont.Dispose();
family.Dispose();
family.Dispose();
}
public FontFamily LoadFontFamily(string fileName, out PrivateFontCollection fontCollection)
{
fontCollection = new PrivateFontCollection();
fontCollection.AddFontFile(fileName);
return fontCollection.Families[0];
}
public Image GenerateBarcode(string barcodeText)
{
Image barcodeImage;
using (barcodeImage = Image.FromFile(@"C:UsersAdministratorDesktopYodelShippingYodelShippingimagesbarcode.bmp"))
{
using (Graphics g = Graphics.FromImage(barcodeImage))
{
g.DrawString(barcodeText,
new Font(barcodeFont, FontStyle.Bold), Brushes.Black,
barcodeImage.Height /2, barcodeImage.Width / 2);
}
}
return barcodeImage;
}
}
Здесь я вызываю код для создания и сохранения изображения штрих-кода. Я получаю исключение при вызове метода Save().
System.Drawing.Image img = barcodeHelper.GenerateBarcode("2lgbub51aj 01000002");
img.Save("~/images/barcode.png");
Ответ №1:
protected void Button1_Click(object sender, EventArgs e)
{
try
{
Barcode barcode = new Barcode();
BarcodeLib.TYPE type = BarcodeLib.TYPE.CODE93;
BarcodeLib.SaveTypes y = SaveTypes.JPG;
barcode.Encode(type, "12344");
barcode.SaveImage(Server.MapPath("~/Barcode\abc.jpg"), y);
Label1.Text = "Image Saved successfully";
}
catch (Exception EE)
{
EE.ToString();
}
}
Ответ №2:
Я думаю, что проблема связана с вашим путем к файлу («~/images/barcode.png»). Вам необходимо использовать действительный абсолютный путь (например, «c:/projects/myproject/images/barcode.png «).
Редактировать: я только что заметил, что это ASP.NET , так что вам нужно будет только сделать это:
img.Save(Server.MapPath("~/images/barcode.png"));
Обратите внимание, что в какой-то момент вы, вероятно, столкнетесь с проблемами с разрешениями (учетная запись, на которой выполняется ваш ASP.NET приложению потребуются разрешения на запись в этом месте).
Комментарии:
1. Просто попробовал это, и я все еще получаю исключение. Есть идеи?
2. Нет, я немного в тупике. В документах говорится, что «Сохранение изображения в тот же файл, из которого оно было создано, запрещено и вызывает исключение»., но похоже, что ваш оригинал есть
barcode.bmp
, а нетbarcode.png
, поэтому он должен работать. Попробуйте сохранить в другом абсолютном местоположении и сохраните его какbarcode.bmp
(на случай, если оно по какой-либо причине не может быть закодировано в PNG).3. Вы также можете настроить пользовательскую перегрузку
Save
, которая принимает формат изображения (поскольку вы конвертируете из BMP в PNG), например:img.Save(Server.MapPath("~/images/barcode.png"), System.Drawing.Imaging.ImageFormat.PNG);
Ответ №3:
- Установите ProcMon (бесплатно от Microsoft)
- Запустите его и создайте фильтр для пути, содержащего штрих-код.png
- Запустите свой код.
Он регистрирует каждый вызов файловой системы и результат (с подробной информацией)
Некоторые идеи
- Каталог не существует
- У вас нет разрешения
Ответ №4:
Image.Save
Методу требуется полный путь. Тильда (~) работает только в ASP.Net . Попробуйте:
img.Save(HttpContext.Current.Server.MapPath("~/images/barcode.jpg"));
Ответ №5:
Я полагаю, что это связано с тем фактом, что вы пытаетесь сохранить относительный путь. Попытка использовать абсолютный путь или получить текущий путь через вызов Environment.CurrentDirectory и добавьте его к вашему пути barcode.png.
Ответ №6:
Я бы проверил, что а) папка images существует там, где вы думаете, и б) что ваш ASP.NET процесс имеет права на запись в него.