IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Erreur GDI + System.Drawing Dotnet standard 2.0 utilisé dans un projet dotnet core 2.1


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Points : 352
    Points
    352
    Par défaut Erreur GDI + System.Drawing Dotnet standard 2.0 utilisé dans un projet dotnet core 2.1
    Bonjour,
    je rencontre une erreur avec l'ajout d'un frame dans une bitmap (écriture dans un stream).
    voici mon code :
    Ma classe en Dotnet Standard 2.0. cette classe wrappe une dll c++ qui fait appel a OpenCV et permet également de lire et écrire des bitmaps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
     
      public class OCVWrapper
        {
            private static ImageCodecInfo getCodecForstring(string type)
            {
                ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
     
                for (int i = 0; i < info.Length; i++)
                {
                    string EnumName = type.ToString();
                    if (info[i].FormatDescription.Equals(EnumName))
                    {
                        return info[i];
                    }
                }
     
                return null;
     
            }
     
            public static byte[] ToMultiTiff(List<byte[]> Imgs)
            {
                MemoryStream tmpSave = new MemoryStream();
                System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.SaveFlag;
                ImageCodecInfo encoderInfo = getCodecForstring("TIFF");
     
                int i = 0;
                try
                {
                    if (Imgs != null)
                    {
     
                        if (Imgs.Count < 1)
                        {
                            throw new Exception("Array d'image vide");
                        }
                        else if (Imgs.Count == 1)
                        {
                            EncoderParameters iparams = new EncoderParameters(1);
                            System.Drawing.Imaging.Encoder iparam = System.Drawing.Imaging.Encoder.Compression;
                            EncoderParameter iparamPara = new EncoderParameter(iparam, (long)(EncoderValue.CompressionNone));
                            iparams.Param[0] = iparamPara;
                            MemoryStream ms = new MemoryStream(Imgs[0]);
                            Bitmap bmp = new Bitmap(ms);
                            bmp.Save(tmpSave, encoderInfo, iparams);
     
                        }
                        else if (Imgs.Count > 1)
                        {
                            EncoderParameters encoderParameters = new EncoderParameters(2);
                            encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);
                            encoderParameters.Param[1] = new EncoderParameter(encoder, (long)EncoderValue.CompressionNone);
                          //  encoderParameters.Param[0] = new EncoderParameter(encoder, 18);
                          //  encoderParameters.Param[1] = new EncoderParameter(encoder, 6);
     
                            EncoderParameters encoderFrameParameters = new EncoderParameters(1);
                            encoderFrameParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage);
                           // encoderFrameParameters.Param[0] = new EncoderParameter(encoder, 23);
     
                            EncoderParameters encoderParameterFlush = new EncoderParameters(1);
                            encoderParameterFlush.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush);
                           // encoderParameterFlush.Param[0] = new EncoderParameter(encoder, 20);
                            byte[] a = new byte[Imgs[0].Length];
                            Imgs[0].CopyTo(a, 0);
                            MemoryStream ms_final = new MemoryStream(a);
     
                            // Save the first frame of the multi page tiff
                            Bitmap firstImage = new Bitmap(ms_final);
                            firstImage.Save(tmpSave, encoderInfo, encoderParameters);
                            //firstImage.Save(tmpSave, ImageFormat.Tiff);
     
                            // Add the remining images to the tiff
                            for (i = 1; i < Imgs.Count; i++)
                            {
                                byte[] tmpbyte = new byte[Imgs[i].Length];
                                Imgs[i].CopyTo(tmpbyte, 0);
                                MemoryStream ms_tmp = new MemoryStream(tmpbyte);
                                Bitmap img = new Bitmap(ms_tmp);
                                firstImage.SaveAdd(img, encoderFrameParameters);
     
                            }
     
                            // Close out the file
     
                            firstImage.SaveAdd(encoderParameterFlush);
     
     
     
                        }
     
     
     
     
                    }
                    else
                    {
                        throw new Exception("Array null");
                    }
                }
                catch (System.Exception ex)
                {
                     throw new Exception($"Erreur Création Multi tiff page {i.ToString()}", ex);
                }
                return tmpSave.ToArray();
            }
            public static List<byte[]> ReadTiff(byte[] byteImg)
            {
                List<byte[]> ImgStreams = new List<byte[]>();
                string ErrorMessage = "";
                int idx = 0;
                int count = 0;
     
                try
                {
                    if (byteImg == null || byteImg.Length <= 0) throw new Exception("Empty Image");
     
                    using (Bitmap bitmap = (Bitmap)Image.FromStream(new MemoryStream(byteImg)))
                    {
     
                        count = bitmap.GetFrameCount(FrameDimension.Page);
                        if (count > 0)
                        {
                            for (idx = 0; idx < count; idx++)
                            {
                                bitmap.SelectActiveFrame(FrameDimension.Page, idx);
                                MemoryStream byteStream = new MemoryStream();
                                bitmap.Save(byteStream, ImageFormat.Tiff);
                                byte[] tmp = new byte[byteStream.ToArray().LongLength];
                                byteStream.ToArray().CopyTo(tmp,0);
                                ImgStreams.Add(tmp);
     
                            }
                        }
                        else
                        {
                            throw new Exception("Document bad Format : 0 pages");
                        }
     
                        bitmap.Dispose();
                    }
     
                }
                catch (Exception ex)
                {
                    ErrorMessage = $"NBPage [{ count}] Last page {idx} Message Exception : [{ex.Message}]";
                    throw new Exception(ErrorMessage, ex);
                }
                return ImgStreams;
            }
            [DllImport("Dll1.dll")]
            private static extern IntPtr ScaleAndCompress(IntPtr buf, int nb_byte, int MaxHeight, int MaxWidth, int flaginterp, ref ulong sizeFinalImg);
     
     
            public static byte[] GenViewerImage(byte[] file , int MaxHeight, int MaxWidth )
            {
     
                List<byte[]> bytePages = new List<byte[]>();
                var a = new OCVWrapper();
     
                    List<byte[]> ImgsByte = ReadTiff(file);
     
                    foreach (byte[] Img in ImgsByte)
                    {
                        unsafe
                        {
                            IntPtr unmanagedPointer = Marshal.AllocHGlobal(Img.Length);
                            Marshal.Copy(Img, 0, unmanagedPointer, Img.Length);
                            ulong sizeFinalImg = 0;
     
                            IntPtr unmanagedScaleAndCompressed = ScaleAndCompress(unmanagedPointer, Img.Length, MaxHeight, MaxWidth, 3, ref sizeFinalImg);
                            Marshal.FreeHGlobal(unmanagedPointer);
                            byte[] tmp = new byte[sizeFinalImg];
                            Marshal.Copy(unmanagedScaleAndCompressed, tmp, 0, (int)sizeFinalImg);
                            bytePages.Add(tmp);
     
     
     
     
     
                        }
     
     
                    }
     
     
                return ToMultiTiff(bytePages);
            }
        }
    le code de mon appli console .netcore 2.1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
     class Program
        {
            static void Main(string[] args)
            {
                byte[] file= File.ReadAllBytes(@"DocumentTest\TiffTest\originaux\A000056871_0007_CBPA0115707706.tif");
                int MaxHeight = 800;
                int MaxWidth = 600;            
                byte[] Multitiff = OCVWrapper.GenViewerImage(file,MaxHeight,MaxWidth);
                File.WriteAllBytes(@"DocumentTest\TiffTest\originaux\A000056871_0007_CBPA0115707706_Viewer.tif",Multitiff);
                return ;
            }
        }
    lors du passage dans ToMultiTiff, le code lève une exception lors du premier passage dans la fonction BITMAP.SaveAdd
    InvalidOperationException*: The operation is invalid [GDI+ status: Win32Error]
    j'ai également essayé de faire simple ReadTiff puis derriere ToMultitiff (sans passer par ma dll c++ du coup ) ==> meme erreur.
    sur le net la plupart du temps l'erreur viens soit de la mauvaise utilisation de l'encoder (paramétrage pas en Multiframe ) ou du fait que le stream utilisé est deja fermé (ce qui ne me semble pas etre le cas ici)

    Autre piste : le même code mais compiler en framework 4.6 ne génère pas d'erreur sur cette partie....
    pourriez-vous m'aider svp?
    merci d'avance
    cdlt,

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Points : 352
    Points
    352
    Par défaut
    Problème résolu,
    une dépendance d'un vieux package (coreCompat.System.Drawing) qui me pourrissait le truc....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur System.Drawing // windows7
    Par ebilel dans le forum Windows Forms
    Réponses: 1
    Dernier message: 23/05/2011, 10h22
  2. Erreur sur System.Drawing.Image
    Par dieudo dans le forum VB.NET
    Réponses: 12
    Dernier message: 12/03/2008, 17h29
  3. [c#] un erreur dans le system.drawing...
    Par pointer dans le forum DirectX
    Réponses: 3
    Dernier message: 13/07/2005, 20h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo