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 :

Taille des fichiers BMP insensée


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut Taille des fichiers BMP insensée
    Bonjours.

    Je sauvegarde un fichier Bitmap en C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bitmap image= (quelque chose);
    image.Save(@"C:\test.bmp");
    La taille de cette image est très petite (131 ko ou 134 738 octets) pour une résolution de 1680 x 1050. Je trouve ça étrange puisque une vraie image Bitmap prendrait beaucoup plus de place que ça. D'ailleur, lorsque j'ouvre cette image avec Paint que j'enregistre sous, l'image pèse alors plus de 5 Mo . De plus, l'image qui pèse 131 Ko, s'ouvre sans problème dans Paint mais Photoshop ne la reconnait pas.

    Quelqu'un aurait une idée de pourquoi cette image pèse moin qu'un JPG (compressé à fond) mais a une qualité parfaite (BMP)? Je ne comprend plus rien.

    Je dois faire du transfert d'image par socket et j'avais fait ce test au début du projet. Mais je viens de me rendre compte que le nombre de bytes qui doivent passer dans le socket n'est pas 140 Ko mais bien 5000 Ko. C'est complètement insensé. Si en même temps quelqu'un aurait un conseil à me donner pour réduire le nombre de bytes à tranférer par internet.

    En gros je dois trouver un moins de faire le transfert d'image le plus rapidement possible par Internet. (Donc avoir des images qui pèse le moins possible) L'idéal serait de pouvoir passer ces fichiers par socket. Le seul accroc dans ce cas est qu'il y aurais sans cesse accès au disque, ce que je ne souhaite pas.

    Merci pour vos conseils.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Salut,

    D'abord, il faut savoir que la classe Bitmap ne représente pas forcément une image bitmap au sens où on l'entend en général (.bmp), mais par opposition à une image vectorielle. Cette classe représente une image définie par la couleur de chacun de ses pixels. Donc en fait, un fichier .jpg ou .png est aussi un Bitmap. Quand tu enregistres l'image en n'indiquant que le nom du fichier, l'image est enregistrée dans le format indiqué par la propriété RawFormat (l'extension du fichier n'est pas prise en compte). Si aucun encodeur n'existe pour ce format, l'image est enregistrée au format PNG, qui est un format compressé, d'où la taille beaucoup plus réduite.

    Si tu veux forcer l'enregistrement dans tel ou tel format, précise le dans l'appel à Save :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image.Save(@"C:\test.bmp", ImageFormat.Bmp);
    Parmi les autres formats prédéfinis dans ImageFormat, il y a notamment Gif, Icon, Jpeg, Png, Tiff...

    Par contre, l'image en mémoire est décompressée (d'où les 5Mo de mémoire utilisés). Si tu veux transmettre l'image via une socket, transmets plutôt les données brutes du fichier (sans utiliser la classe Bitmap).

    EDIT:
    Photoshop ne la reconnait pas
    Parce que l'extension du fichier ne correspond pas à son format réel. D'ailleurs ça m'étonne que Photoshop ne soit pas capable de détecter ça... IrfanView, par exemple, prévient quand l'extension n'est pas la bonne.

  3. #3
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut
    Merci

    Si tu veux transmettre l'image via une socket, transmets plutôt les données brutes du fichier (sans utiliser la classe Bitmap).
    Qu'est-ce que tu entend par là? Ce que j'ai fait en ce moment c'est de faire un LockBit sur l'image et d'envoyer simplement le Byte[] au socket. C'est super simple. Sauf que si on fait le calcul, 1680 * 1050 * 3 (image 24 bits) = beaucoup d'octets. 5.2 Mo pour être plus précis. Ce qui revient exactement à envoyer un fichier BMP non compressé.

    C'est beaucoup trop lent. Je ne sais pas a quoi exactement tu fais référence en parlant de "données brutes"

    Merci encore.

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Pour limiter la taille des données transmises, tu peux toujours compresser ton BMP et transférer le buffer des données compressées. Sur un BMP ça limitera grandement les données à échanger je pense.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par deejay2221 Voir le message
    Je ne sais pas a quoi exactement tu fais référence en parlant de "données brutes"
    Je veux dire que, au lieu de décoder l'image et d'envoyer les données décodées (ce que tu fais avec la classe Bitmap et la méthode LockBits), il faut que tu lises simplement le fichier et que tu envoies directement les données du fichier sur ta socket. Fais abstraction du fait que c'est une image, envoie le comme n'importe quel autre fichier...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FileStream file = new FileStream(@"C:\test.bmp", FileMode.Open, FileAccess.Read);
    while(file.Position < file.Length)
    {
        byte[] buffer = new byte[MaxBufferSize];
        int nRead = file.Read(buffer, 0, MaxBufferSize);
        socket.Send(buffer, 0, nRead, SocketFlags.None);
    }
    file.Close()
    EDIT: Je viens de voir qu'il y a (beaucoup) plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket.SendFile(@"C:\test.bmp");

  6. #6
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut
    Oké merci pour vos réponse. Le problème en fait, est que l'image ne provient pas d'un fichier mais directement d'un bitmap. (Je fais un printscreen de l'écran avec une fonction de .net)

    Je voudrait donc trouver un moyen de compresser l'image de la classe bitmap directement en mémoire sans passer par le disque dur. Je ne sais pas s'il y a moins de simuler un Bitmap.Save() mais qui reste dans un objet en mémoire au lieu d'un fichier sur disque. Ça m'étonnerais vraiment... j'essaye de me convaincre qu'il y a une solution facile

    pour le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket.SendFile(@"C:\test.bmp");
    ça serait parfait, sauf que là, on accède au disque

    Je sens qu'on y est presque.
    Merci encore

  7. #7
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par deejay2221 Voir le message
    Oké merci pour vos réponse. Le problème en fait, est que l'image ne provient pas d'un fichier mais directement d'un bitmap. (Je fais un printscreen de l'écran avec une fonction de .net)

    Je voudrait donc trouver un moyen de compresser l'image de la classe bitmap directement en mémoire sans passer par le disque dur.
    Utilises un MemoryStream

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Bitmap bmp = ...;
    using(MemoryStream ms = new MemoryStream())
    {
        bmp.Save(ms, ImageFormat.Bmp);
        // A ce stade, ms contient le contenu binaire de l'image 
        // sous la forme d'un tableau d'octets. 
        byte[] buffer = ms.ToArray();
    }
    Après pour la compression tu peux regarder du côté de SharpZipLib. Tu pourras effectuer la compression en mémoire également, si tu en as besoin, en utilisant un MemoryStream comme flux sous-jascent

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

Discussions similaires

  1. [9i] taille des fichiers data
    Par muslem dans le forum Oracle
    Réponses: 7
    Dernier message: 20/12/2005, 10h55
  2. [Redo log] : augmenter la taille des fichiers
    Par user_oracle dans le forum Oracle
    Réponses: 3
    Dernier message: 29/11/2005, 19h49
  3. Taille des fichiers limitée à 4Go
    Par alain sayagh dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 13/06/2005, 17h58
  4. Réduire la taille des fichier .LDF ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 31/03/2005, 11h48
  5. Taille des fichiers Interbase et Firebird
    Par Equus dans le forum Débuter
    Réponses: 5
    Dernier message: 21/03/2005, 15h50

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