Enregistrer Bitmap en .Net sauve l'image dans un format incorrect?

voix
3

Nous avons un morceau de code qui permet d'économiser un .Net System.Drawing.Bitmap fichier. L'STOCKER spécifie l'emplacement du fichier, ainsi que le ImageFormat que nous nous attendons à enregistrer les données d'image en Jpeg code de sorte à ressemble à ceci:

public MediaFile IngestImage(System.Drawing.Bitmap imgSrc, string name){
     ... // left out because it is not relevant to this question
     imgSrc.Save(fullPath, System.Drawing.Imaging.ImageFormat.Jpeg);
     ... // left out because it is not relevant to this question
}

Pour une raison quelconque de temps cette méthode génère des images PNG sous forme de fichiers .jpg. La plupart du temps il n'est pas une grosse affaire mais un autre morceau du projet a des problèmes avec ces fichiers ne pas être réels (jpegs Windows Media Services).

Toute aide est appréciée, at-on jamais vu ça?

Remarque: chemin complet est quelque chose comme \ servcer \ share \ file.jpg. Nous économisons jpg avec l'extension « jpg ». D'où la question ... Plus tard, nous créons des points de publication sur un serveur Windows Media pour jouer une playlist SMIL nous avons alors « Annoncer » les fichiers et formats au point de publication lorsque le point d'édition commence la lecture attend un fichier Jpg parce que est l'extension du fichier et le contenu est en fait un PNG

Voici le code réel création de l'objet BitpMap qui est passé dans la méthode ci-dessus ...

        public static Bitmap CreateBitmap(string text, int height, int width, Color foregroundColor, Color backgroundColor, string fontName, int fontSize, bool antialias)
    {
        // Initialize graphics
        Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
        using (Graphics g = Graphics.FromImage(bmp))
        {
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            if (antialias)
            {
                g.SmoothingMode = SmoothingMode.AntiAlias;
                g.TextRenderingHint = TextRenderingHint.AntiAlias;
            }

            // Set colors
            SolidBrush fgBrush = new SolidBrush(foregroundColor);
            SolidBrush bgBrush = new SolidBrush(backgroundColor);

            // paint background
            RectangleF rectF = new RectangleF(0, 0, width, height);
            g.FillRectangle(bgBrush, rectF);

            // Load font
            FontFamily fontFamily = FontFamily.GenericSerif;
            Font font = new Font(fontFamily, fontSize, FontStyle.Regular, GraphicsUnit.Pixel);
            try
            {
                fontFamily = new FontFamily(fontName);
                font = new Font(fontFamily, fontSize, FontStyle.Regular, GraphicsUnit.Pixel);
            }
            catch { }

            // Set font direction & alignment
            StringFormat format = new StringFormat();
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;

            // Finally, draw the text
            g.DrawString(text, font, fgBrush, rectF, format);

            return bmp;
        }
    }
Créé 28/08/2009 à 16:13
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
3

Je cette approche par:

  1. dépouillant CreateBitmap(). Par exemple, ne semble le problème si vous supprimez tout sauf la ligne qui appelle newet la returnligne? Je suppose que ce serait, mais il vaut la peine de vérifier. Si le hasard étrange problème disparaît avec cette modification, utilisez alors une recherche binaire pour voir si vous pouvez le suivre jusqu'à une ligne particulière.

  2. enveloppant l' Saveappel avec try/ catchpour voir si quelque part un ExternalExceptionest mangé en silence. Bitmap.Save()(hérité de Image.Save()) dit le texte suivant à propos de ExternalException:

L'image a été enregistrée avec le mauvais format d'image.

-ou-

L'image a été enregistrée dans le même fichier, il a été créé à partir.

Est - il possible que les fichiers qui n'existent déjà fullPathau format PNG avec l'extension .jpg?

Créé 08/09/2009 à 17:59
source utilisateur

voix
2

Je rencontre également ce problème dans une application de culture. Le fichier image source est un JPG. J'ai essayé plusieurs différents types de ImageFormat, et dans tous les cas le format enregistré est au format PNG avec une extension de fichier JPG. Photoshop se plaint alors «type de marqueur JPEG non valide. Si je Renommez le fichier .png il ouvre bien dans Photoshop.

Tentative cela avec une autre image, produit un format JPG correct avec l'extension JPG.

Je soupçonne que le format du fichier d'origine pourrait être à blâmer. Je vais poster mes résultats lorsque ce problème est résolu.

Créé 15/09/2009 à 17:12
source utilisateur

voix
1

Eh bien, je l'ai donné a tiré et a essayé de repro la question avec le code ci-dessus. Voici à peu près ce que je faisais:

    Random r = new Random();
    for (int i = 0; i < max; i++)
    {
        System.Diagnostics.Debugger.Break()
        int size = 1 + i;
        int width = 1 + i;
        SaveBitmap(@"C:\Projects\test.jpg", ImageFormat.Jpeg, "hello", size, width, Color.Black, Color.White, "Arial", size, true);
        SaveBitmap(@"C:\Projects\test.png", ImageFormat.Jpeg, "hello", size, width, Color.Black, Color.White, "Arial", size, true);
        SaveBitmap(@"C:\Projects\test.jpg", ImageFormat.Jpeg, "hello", size, width, Color.Black, Color.White, "Arial", size, false);
        SaveBitmap(@"C:\Projects\test.png", ImageFormat.Jpeg, "hello", size, width, Color.Black, Color.White, "Arial", size, false);
    }

    public static void SaveBitmap(string filename, ImageFormat format, string text, int height, int width, Color foregroundColor, Color backgroundColor, string fontName, int fontSize, bool antialias)
    {
        using (Image source = CreateBitmap(text, height, width, foregroundColor, backgroundColor, fontName, fontSize, antialias))
            source.Save(filename, format);

        using (Image imgLoaded = Bitmap.FromFile(filename))
        {
            if (imgLoaded.RawFormat.Guid != format.Guid)
                throw new InvalidOperationException();
        }
    }

Cela va sans problème et le test si (imgLoaded.RawFormat.Guid! = Format.Guid) ne rompt jamais dans le débogueur. Je devine que vous avez un peu plus de code que la routine CreateBitmap affiché ci-dessus.

Ma recommandation:

Modifier votre code et insérer la déclaration de vérification dans le SaveBitmap ci-dessus () juste après votre appel à Image.Save (). Ensuite, allez casser comme voir comment vous y êtes arrivé ...

Créé 09/09/2009 à 02:48
source utilisateur

voix
0

C # Win7 (64bit) VS 2010 Bitmap.Save ( "wnd.bmp") enregistre au format .png. MainWnd est une forme de C # je capture et tenter de d'enregistrer le fichier en tant que bitmap.

        Bitmap bmp = new Bitmap(MainWnd.ActiveForm.Width, MainWnd.ActiveForm.Height);
        Rectangle crec = MainWnd.ActiveForm.ClientRectangle;
        Rectangle r = this.ClientRectangle;
        MainWnd.ActiveForm.DrawToBitmap(bmp, r);
        bmp.Save("wnd.bmp");  // saves as PNG not BMP !!

00000000 89 50 4E 47 0D 0A 1A 0A - 00 00 00 49 48 44 0D 52 ‰ PNG ........ IHDR 00000010 00 00 04 00 00 02 0B E6 - 08 06 00 00 00 24 30 1D ... .... æ ..... 0 $. 00000020 D1 00 00 00 01 73 52 47-42 00 AE CE 1C E9 00 00 Ñ .... sRGB.®Î.é ..

Créé 28/06/2016 à 16:55
source utilisateur

voix
0

vous pouvez essayer cette option pour enregistrer le fichier

public bool ResizeImage(string OriginalFilepath, string NewFilepath)
    {
        Bitmap original = (Bitmap)Image.FromFile(OriginalFilepath);
        Bitmap resized = new Bitmap(original, new Size(width,height));
        resized.Save(NewFilepath.jpeg);

    }
Créé 11/02/2014 à 10:34
source utilisateur

voix
0

Avez-vous essayé de placer le ImageCodecInfo explicitement?

Dim enc = ImageCodecInfo.GetImageEncoders().ToList().Find(Function(e) e.MimeType = "image/png")
objBitMap.Save(stream, enc, params)
Créé 09/02/2010 à 17:14
source utilisateur

voix
0

Peut-être cela est un problème avec le nom de fichier ou l'utilisateur est specifiing. il se pourrait que si elle se termine par .png alors jpegformat est ignoré et un fichier PNG est généré.

Créé 13/09/2009 à 22:53
source utilisateur

voix
-1

Il semble que votre fullPath pourrait être sauver le fichier avec une extension .png, et vous dire imgSrc pour compresser l'image en utilisant la compression Jpeg.

Je vérifie que l'extension du fullPath est jpeg ou jpg, et non png.

Voici la doc msdn sur la Save.

Créé 28/08/2009 à 16:22
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more