Comment dessiner une image PNG à l'aide de LoadImage et StretchDIBits?
(Ceci est lié à la question sur Comment charger une image au format PNG à l'aide Win32/GDI (pas de GDI+ si possible)?.)
Salut à tous,
Je me demandais, étant donné que vous avez un PNG de ressources incorporées dans un fichier binaire avec l'ID IDB_PNG1
, et un LPDRAWITEMSTRUCT
à dessiner (ce qui signifie que vous avez le HDC
et le rectangle pour votre cible), comment pouvez-vous tirer de cette image sur l'écran à l'aide StretchDIBits
? J'ai travaillé avec BitBlt
et TransparentBlt
avant, mais StretchDIBits
semble fonctionner différemment, et LoadImage
ne semble pas fonctionner avec la PNG.
Merci!
(Remarque: La langue que j'ai mis est le C++, mais ce n'est pas trop important... C, C#, Visual Basic, etc. ce serait bien, je suis juste essayer de comprendre les étapes, pas le code exact nécessaire.)
OriginalL'auteur Mehrdad | 2010-12-31
Vous devez vous connecter pour publier un commentaire.
Je pense que le PNG support à l'intérieur des bitmaps est vraiment pour une utilisation par les pilotes d'imprimante. Pour affichage à l'écran, vous aurez probablement à décompresser le PNG données vous-même en utilisant un code comme libpng.
Les imprimantes généralement (bien, au moins historiquement) ont beaucoup plus de capacité que les cartes graphiques. Les imprimantes sont également au bas de la bande passante des connexions, donc de l'économie de bits est important dans l'envoi de données à une imprimante (il est préférable d'envoyer un comprimé PNG pour une imprimante qui a la capacité de décoder, que d'envoyer tous les raw bits). Cela permet aussi à l'imprimante pour choisir le plus approprié de la fidélité d'options quand il ne la décompression lui-même. Cependant, matériel d'affichage et généralement, les pilotes veulent être plus déterministe et éviter de faire de décompression eux-mêmes.
Comment fonctionne la fonction de savoir si il est utilisé pour une imprimante plutôt que d'un écran?
La fonction passe vos données pour le pilote. Le conducteur peut afficher, ou de dire "désolé, je ne sais pas comment le faire".
Oui... d'Après MSDN: "Sur certaines versions de Microsoft Windows, la
StretchDIBits
etSetDIBitsToDevice
fonctions permettent d'images JPEG et PNG pour être transmis en tant que source de l'image pour les périphériques d'impression." Merci pour la réponse!OriginalL'auteur Greg Hewgill
J'ai écrit un post de blog (sur l'affichage d'un écran de démarrage avec le C++) qui contient un exemple de code complet qui charge une image PNG à partir d'une ressource et la convertit en un HBITMAP (à l'aide de WIC). Vous pouvez ensuite utiliser CreateCompatibleDC, de la Méthode, et BitBlt pour l'afficher dans la cible HDC.
Alors que je n'ai jamais essayé, vous devriez être en mesure d'utiliser StretchDIBits pour afficher le PNG directement si vous chargez le raw d'octets à partir de la ressource en mémoire, et mis en place un BITMAPINFOHEADER struct avec la largeur, la hauteur, etc. comme démontré dans cette MSDN échantillon.
C# et VB.NET des solutions serait tout à fait différent parce que vous pourriez utiliser Système.Dessin (un wrapper pour GDI+) ou d'un Système.De Windows.Médias.L'imagerie (dans une application WPF) pour gérer le chargement de l'image et du dessin.
BITMAPINFOHEADER
: comment puis-je savoir ce que les dimensions de l'image sont? Je serais encore obligé d'utiliser WIC? (Edit: Il semble que ce ne serait pas, voir mon commentaire sur Greg. Mais je vous remercie beaucoup pour le lien vers le blog, il va très certainement être utile... je souhaite que je pourrais marquer deux postes une réponse. 🙂 )Pour connaître les dimensions de l'image, vous feriez soit écrire un png décodeur (ou utilisez libpng ou WIC) de les lire à partir du fichier PNG, ou de les stocker dans une ressource distincte qui est gardé en synchronisation avec votre PNG ressource. (C'est en partie pourquoi je n'ai jamais essayé les StretchDIBits approche; j'ai toujours utilisé des libpng ou WIC pour gérer tous le PNG de lecture.)
OriginalL'auteur Bradley Grainger