none
A generic error occurred in GDI+ RRS feed

  • Pergunta

  • bom dia!

    alguem consegue me ajudar com esse problema?

    A generic error occurred in GDI+

    IntPtr bitmapPtr;
    _twain.BeginTransfer(out bitmapPtr, out error);
    System.Drawing.Bitmap bitmap = System.Drawing.Bitmap.FromHbitmap(bitmapPtr);

    quarta-feira, 18 de maio de 2016 18:22

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.



    quinta-feira, 26 de maio de 2016 19:31

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.

    quinta-feira, 19 de maio de 2016 13:47
  • olá!

    nesse trecho de código que enviei, ocorre na última linha.. 

    quinta-feira, 19 de maio de 2016 14:07
  • 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.



    quinta-feira, 26 de maio de 2016 19:31
  • 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..

    terça-feira, 31 de maio de 2016 12:48