2015-05-21 3 views
0

Я спасаю изображения с камеры в цикле, но несколько раз он дает общую ошибку в GDI + в некоторой системе в то время как я использую i7 4gb баран и доцент приходит, когда я использую систему барана i3 4gnbОбщая ошибка в GDI +

for (int i = 1; i <= frameno; i++) 
{ 
    Bitmap bm = new Bitmap(1024,1280); 
    Int32 s32MemID; 
    Camera.Memory.GetActive(out s32MemID); 
    Camera.Memory.CopyToBitmap(s32MemID, out bm); 
    bm.RotateFlip(RotateFlipType.Rotate90FlipNone); 
    String str = ""; 
    if (i < 10) 
    { 
     str = "00"; 
    } 
    else if (i < 100) 
    { 
     str = "0"; 
    } 
    bm.Save(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\capture" + str + i + ".bmp", ImageFormat.Bmp); 
    Thread.Sleep(delay); 
} 

пожалуйста, кто-нибудь дать мне решение очень имп для меня

+1

это во время сохранения или в другое время появляется ошибка GDI +? Вам действительно нужно создать новое растровое изображение в каждом цикле, или вы можете использовать повторное использование растрового изображения, определяя его перед циклом? Вы располагаете свое изображение в конце цикла? Когда-либо слышал о 'i.ToString(). PadLeft ('0', 3)', чтобы добавить 00 в индекс, почему и как долго это задержка в вашем цикле. И какую библиотеку камеры вы используете? – Icepickle

+0

Его частная камера lib и задержка составляет около 500, и при этом появляется ошибка при сохранении bmp – user3269550

+0

Вы можете начать с размещения кода внутри блока 'using', как этот' using (Bitmap bm = new Bitmap (1024,1280)) {.. .} '. Возможно, это может решить вашу проблему, даже если это не правильный способ обработки ресурсов IDisposable. –

ответ

0

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

Int32 s32MemID; 
Bitmap bm; 
string targetPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); 
for (int i = 1; i <= frameno; i++) 
{ 
    try 
    { 
     Camera.Memory.GetActive(out s32MemID); 
     Camera.Memory.CopyToBitmap(s32MemID, out bm); 
     bm.RotateFlip(RotateFlipType.Rotate90FlipNone); 
     bm.Save(Path.Combine(targetPath, "capture" + (i.ToString().PadLeft('0', 3)) + ".bmp"), ImageFormat.Bmp); 
    } 
    finally 
    { 
     if (bm != null) 
     { 
      bm.Dispose(); 
      bm = null; 
     } 
    } 
    Thread.Sleep(delay); 
} 

обычно я sugges t, но поскольку вы не показываете, как метод Camera.Memory.CopyToBitmap обрабатывает параметр Bitmap, трудно сказать, как это должно быть сделано, и если это ваша собственная библиотека, я не понимаю, зачем вам нужен параметр out , так как битмап будет передан по ссылке в любом случае)

+1

Осторожно о 'out' - вполне возможно, что это плохо написанный P/Invoke и что правильный модификатор будет' ref' - 'out' не является особенностью IL, только C# (он переводится to 'ref' в IL). Тем не менее, уже довольно подозрительно, что фактический объект «Bitmap» передан ... Но да, определенно лучше и безопаснее, чем версия OP. – Luaan

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

  • Нет связанных вопросов^_^