2016-02-03 2 views
0

Мне нужно сделать изображение с холста и из Интернета Я нахожу этот код, который отлично работает. Делает образ и хорошо. Но теперь мне нужно добавить текст в это новое изображение, и я думаю, что это проблема. Иногда работает, иногда бросает мне это исключение. Как закрыть изображение и снова изменить изображение. Или как я могу изменить изображение без исключения.Как закрыть файл изображения с помощью FileStream

int width = (int)(SystemParameters.PrimaryScreenWidth * 0.75); 
int height = (int)canvas.Height; 

RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
width, (int)canvas.Height, 96d, 96d, PixelFormats.Pbgra32); 
// needed otherwise the image output is black 
canvas.Measure(new System.Windows.Size(width, height)); 
canvas.Arrange(new Rect(new System.Windows.Size(width, height))); 

renderBitmap.Render(canvas); 

//JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
PngBitmapEncoder encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 

using (FileStream file = File.Create(filename)) 
{ 
    encoder.Save(file); 
} 

Это то, что у меня есть исключение:

Процесс не может получить доступ к файлу «image.png», так как он используется другим процессом.

Я стараюсь с file.Close(), я стараюсь не file.Close()filename это путь к файлу изображения, которые создают и затем используется и попытаться удалить

Вот и мой код Этот код выполняется 1 раз в секунду.

private void CreateSaveBitmap(Canvas canvas, string filename, string sensor) 
{ 
    int width = (int)(SystemParameters.PrimaryScreenWidth * 0.75); 
    int height = (int)canvas.Height; 

    RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
     width, (int)canvas.Height, 
     96d, 96d, PixelFormats.Pbgra32); 
    // needed otherwise the image output is black 
    canvas.Measure(new System.Windows.Size(width, height)); 
    canvas.Arrange(new Rect(new System.Windows.Size(width, height))); 

    renderBitmap.Render(canvas); 

    //JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
    PngBitmapEncoder encoder = new PngBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 

    using (FileStream file = File.Create(filename)) 
    { 
     encoder.Save(file); 
     file.Close(); 
    } 

    string head = SetHeadForPrintImage(sensor); 
    Bitmap bmp = new Bitmap(filename); 
    Graphics g = Graphics.FromImage(bmp); 

    g.DrawString(head, new System.Drawing.Font("Tahoma", 12f, System.Drawing.FontStyle.Regular), System.Drawing.Brushes.Black, new PointF(200, 0)); 

    bmp.SetResolution(300, 300); 
    File.Delete(filename); // throw me exception 
    File.Delete(@".\Print\" + sensor + ".jpg"); 
    bmp.Save(@".\Print\" + sensor + ".jpg"); 
} 
+0

Закрытие файла, не закрывается сразу, поэтому попробуйте добавить Sleep, чтобы дождаться его закрытия. Но я думаю, что вам не нужно будет преобразовать renderBitmap в Bitmap, не сохраняя его в файл. – AntiHeadshot

+1

Вы уверены, что изображение не открывается в программе просмотра, когда вы получаете исключение? Кроме того, отключите антивирус – owairc

+0

@AntiHeadshot со сном снова выбрасывает меня исключение – somePeaple

ответ

1
private void CreateSaveBitmap(Canvas canvas, string filename, string sensor) 
{ 
    if(File.Exists(@".\Print\" + sensor + ".jpg")) 
    { 
     File.Delete(@".\Print\" + sensor + ".jpg"); 
    } 
    int width = (int)(SystemParameters.PrimaryScreenWidth * 0.75); 
    int height = (int)canvas.Height; 

    RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
     width, (int)canvas.Height, 
     96d, 96d, PixelFormats.Pbgra32); 
    // needed otherwise the image output is black 
    canvas.Measure(new System.Windows.Size(width, height)); 
    canvas.Arrange(new Rect(new System.Windows.Size(width, height))); 

    renderBitmap.Render(canvas); 

    //JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
    PngBitmapEncoder encoder = new PngBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 

    using (FileStream file = File.Create(filename)) 
    { 
     encoder.Save(file); 
     file.Close(); 
    } 

    string head = SetHeadForPrintImage(sensor); 
    Bitmap bmp = new Bitmap(filename); 
    Graphics g = Graphics.FromImage(bmp); 

    g.DrawString(head, new System.Drawing.Font("Tahoma", 12f, System.Drawing.FontStyle.Regular), System.Drawing.Brushes.Black, new PointF(200, 0)); 

    bmp.SetResolution(300, 300); 
    bmp.Save(@".\Print\" + sensor + ".jpg"); 
    bmp.Dispose(); 
    File.Delete(filename); 
} 

Растровые объекты часто содержат ссылку на файл, который они считываются из, и файл не может быть удален в то время как растровое открыта (это отличается в зависимости от того, какой формат файла изображение, оно может быть безопасно удалять исходный файл png, но не jpg и т. д.). Вы всегда должны вызывать Dispose() для объектов, которые являются IDisposable. Лучше всего было бы, если бы вы могли поместить объект bmp в оператор using

+0

Снова у меня есть это исключение – somePeaple

+0

Какая строка теперь бросает? Это строка 'File.Delete (filename);' или это 'File.Delete (@". \ Print \ "+ sensor +" .jpg ");'? – mortb

+0

обе. Иногда File.Delete (filename) ;, иногда File.Delete (@ ". \ Print \" + sensor + ".jpg"); – somePeaple

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