Usuário com melhor resposta
A generic error occurred in GDI+

Pergunta
-
Respostas
-
Boa tarde Kngipa,
Segundo a documentação Microsoft: Quando um objeto de imagem ou um objeto de Bitmap é construído a partir de um arquivo, o arquivo permanecerá bloqueado por toda a vida do objeto. Como resultado, você não pode alterar uma imagem e salvá-lo novamente para o mesmo arquivo de origem.
Como o arquivo está locado, você pode tentar as soluções abaixo:
string outputFileName = "..."; using (MemoryStream memory = new MemoryStream()) { using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite)) { thumbBMP.Save(memory, ImageFormat.Jpeg); byte[] bytes = memory.ToArray(); fs.Write(bytes, 0, bytes.Length); } }
Bitmap newBitmap = new Bitmap(thumbBMP); thumbBMP.Dispose(); thumbBMP = null; newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
Obs: O importante delas é o desbloqueio da memória, adeque ao seu exemplo.
Mais informações: Bitmap
Att., Roberto Alves
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
- Editado Roberto AB Filho quinta-feira, 26 de maio de 2016 19:32
- Marcado como Resposta Thales F Quintas quinta-feira, 26 de maio de 2016 19:32
Todas as Respostas
-
Bom dia kngipa,
Em que momento isso acontece?
Pode nos providenciar mais informações por gentileza?
Abraço.
Thales F Quintas
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
TechNet Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
-
Boa tarde Kngipa,
Segundo a documentação Microsoft: Quando um objeto de imagem ou um objeto de Bitmap é construído a partir de um arquivo, o arquivo permanecerá bloqueado por toda a vida do objeto. Como resultado, você não pode alterar uma imagem e salvá-lo novamente para o mesmo arquivo de origem.
Como o arquivo está locado, você pode tentar as soluções abaixo:
string outputFileName = "..."; using (MemoryStream memory = new MemoryStream()) { using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite)) { thumbBMP.Save(memory, ImageFormat.Jpeg); byte[] bytes = memory.ToArray(); fs.Write(bytes, 0, bytes.Length); } }
Bitmap newBitmap = new Bitmap(thumbBMP); thumbBMP.Dispose(); thumbBMP = null; newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
Obs: O importante delas é o desbloqueio da memória, adeque ao seu exemplo.
Mais informações: Bitmap
Att., Roberto Alves
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
- Editado Roberto AB Filho quinta-feira, 26 de maio de 2016 19:32
- Marcado como Resposta Thales F Quintas quinta-feira, 26 de maio de 2016 19:32
-
olá, pessoal.. ainda não consegui resolver esse problema.. a minha função onde o problema ocorre é a seguinte:
ServiceError serviceError; var profileService = new CapabilityProfileService(); var profile = profileService.SelectSingle(profileID, out serviceError); if (serviceError == null) { TwPendingXfers pendingXfers = new TwPendingXfers() { Count = -1 }; var begin = DateTime.Now; int i = 1; do { cGerarImagem oImagem = new cGerarImagem(); IntPtr iAux = new IntPtr(); _twain.BeginTransfer(out iAux, out error); if (error != null) break; oImagem.pIPTwain = iAux; i++; try { Bitmap bitAux = new Bitmap(oImagem.FromHDib()); result.Add(bitAux); bitAux.Dispose(); bitAux = null; Win32.GlobalFree(iAux); Win32.GlobalFree(oImagem.pIPTwain); _twain.EndTransfer(out pendingXfers, out error); if (error != null) break; } catch (Exception ex) { throw; } } while (pendingXfers.Count != 0 && numberPages != 0);
observe que tenho um loop que executa um método para transformar meu ponteiro em um Bitmap.. esse processo funciona sem nenhum problema até chegar na página 16, quando chega nessa página ocorre o erro "Parâmetro inválido" na linha em negrito.. a rotina que faz a conversão do IntPtr para Bitmap é a seguinte..
Win32.BITMAPINFOHEADER bmi; IntPtr pixptr; var ptr = Win32.GlobalLock(ipTwain); GetPixelInfo(ptr, out pixptr, out bmi); Bitmap bitMap = new Bitmap(bmi.biWidth, bmi.biHeight); Graphics scannedImageGraphics = Graphics.FromImage(bitMap); IntPtr hdc = scannedImageGraphics.GetHdc(); SetDIBitsToDevice( hdc, 0, // XDest 0, // YDest bmi.biWidth, bmi.biHeight, 0, // XSrc 0, // YSrc 0, // uStartScan bmi.biHeight, // cScanLines pixptr, // lpvBits ptr, // lpbmi 0); // 0 = literal RGB values rather than palette scannedImageGraphics.ReleaseHdc(hdc); const float inchPerMeter = 39.3700787F; bitMap.SetResolution(bmi.biXPelsPerMeter / inchPerMeter, bmi.biYPelsPerMeter / inchPerMeter); // bitMap.Save(@"c:\0\2.bmp", ImageFormat.Bmp); // debug code Win32.GlobalUnlock(ipTwain); Win32.GlobalFree(ipTwain); Win32.DeleteDC(hdc); return bitMap;
não estou habituada a trabalhar com ponteiros, e já tentei várias alternativas.. mas simplesmente não consigo chegar a uma solução..