Je viens de constater 2 choses :
- L'algo de redimensionnement HQ dans WD18 est légèrement meilleur que dans WD15.
- Le HQ dans WD15 ne s'active pas sur une image avec de la transparence comme celle-ci.
Je suis étonné de ça.
Sinon, System.Drawing est une surcouche à GDI+.
Une remarque hors sujet en passant : je lis beaucoup sur ce forum le mot "çà".
C'est "ça".
On écrit "çà" uniquement dans "çà et là", où ce n'est pas du tout le même mot.
Ça me démangeait...
J'ai le framework .Net 4 sur mon pc mais il faut obligatoirement le 4.5 ? Car il à l'air de ne fonctionner qu'à partir de Windows 7 SP1... Et je voudrais que ça fonctionne aussi sous XP.
Par ailleurs, même avec le Framework installé sur mon pc, dans Windev lors de l'ajout d'un assemblage .Net, il ne trouve pas System.Drawing ni mscorlib...
Il faut un pack développeur ?
Merci
non non pas de besoin de pack développeur,
même un dotnet 2.0 devrait suffire. C'est bizarre que tu ne vois pas System.Drawing et surtout mscorlib. Que vois-tu comme assemblages ?
Quelle version de windev as-tu ? sous quel O.S es-tu ? 32 bits , 64 bits ? projet 32 bits , 64 bits ?
moi je suis sous Windows 7 SP 1, Windev 16 , dotnet 3.5.
Donc dans ton code, on sert de System.Drawing et de l'api GDI à ce que je vois ?
Et ça se passe donc en 3 étapes ?
EDIT :
Je remarque que c'est un bitmap et non du png et donc on perd la transparence de fond
Impossible de gérer la transparence en restant dans le format d'origine ?
De plus, l'image redimensionnée est un peu "coupée" sur les bords :s
Merci
Vous pensez qu'en utilisant ceci : System.Drawing.Imaging.Imageformat.Png
http://msdn.microsoft.com/fr-fr/libr...v=vs.110).aspx
Au lieu de System.Drawing.Bitmap pour avoir la gestion de la transparence ?
hello,
voici comment gérer la transparence pour ton Logo. J'ai récupéré ton logo original. Le premier pixel de ton logo est transparent. On va utiliser ceci dans les champs image. Mettre la propriété Transparence à point-haut gauche dans les champs Image.
Dans mon projet j'ai rajouté un champ image (image5). Pour "copier" la transparence j'utilise la fonction GdiTransparentBlt. Celle-ci a besoin de la couleur de transparence. Je récupère cette couleur en lisant le premier pixel. Et voici ce que cela donne en code (le code de l'image 4 y est aussi pour montrer les différences) :
A noter la libération mémoire par rapport à l'ancien code
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 dcimg3 est un entier = dDébutDessin(Image4) hdcCompatible3 est un entier = API("gdi32","CreateCompatibleDC",dcimg3) obj est un entier = API("gdi32","SelectObject",hdcCompatible3,Superbitmap.GetHbitmap()) API("gdi32","BitBlt",dcimg3,0,0,Image4..Largeur,Image4..Hauteur,hdcCompatible3,0,0,0x00CC0020) API("user32","InvalidateRgn",Handle(Image4),0,True) API("gdi32","DeleteObject",obj) API("gdi32","DeleteDC",hdcCompatible3) dcimg4 est un entier = dDébutDessin(Image5) hdcCompatible4 est un entier = API("gdi32","CreateCompatibleDC",dcimg4) obj = API("gdi32","SelectObject",hdcCompatible4,Superbitmap.GetHbitmap()) // récupération de la couleur du premier pixel pour la transparence TransparentColor est un entier = API("gdi32","GetPixel",hdcCompatible4 ,0,0) API("gdi32","GdiTransparentBlt",dcimg4,0,0,Image5..Largeur,Image5..Hauteur,hdcCompatible4,0,0, Image5..Largeur,Image5..Hauteur, TransparentColor) API("user32","InvalidateRgn",Handle(Image5),0,True) // libération des objets, contextes , bitmaps API("gdi32","DeleteObject",obj) API("gdi32","DeleteDC",hdcCompatible4) bitmapNouveau.Dispose() bitmapOriginal.Dispose() Superbitmap.Dispose()
En pièce jointe ce que cela donne avec un fond de fenêtre orange. On voit la transparence sur l'image originale et sur l'image 5
Amicalement, nullosse
Pour gérer correctement le canal alpha, c'est à dire même la semi-transparence, il vaut mieux utiliser GDI+. Là vous utilisez GDI tout court.
Avec System.Drawing ça devrait pas être compliqué.
Pour transférer l'image sans faire un dDébutDessin + du GDI, contentez-vous de la sauvegarder dans un PNG en mémoire (dans un buffer) et de la passer au champ image.
Dans le code ci-dessus, vous utilisez une colorkey, ce qui rend inutile l'usage de GDI, puisque WD15 sait redimensionner une image avec ce type de transparence en HQ.
bonjour,
heu! dite-moi monsieur Hibernatus, comment faites-vous ceci :
j'arrive à faire la première partie comme ceci :et de la passer au champ image.
le problème, c'est que je n'arrive pas à récupérer un buffer à partir de la memorystream pour l'affecter au champ image.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mem est un MemoryStream Superbitmap.Save(mem,ImageFormat.Png)
Je peux seulement récupérer un tableau d'octets ( mem.ToArray())
comment transformer ce tableau d'octets en buffer ? (sans passer par transfert)
sinon en passant par un fichier cela marche :
Amicalement, nullosse
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Superbitmap.Save("test.png",ImageFormat.Png) image2 = "test.png"
La sauvegarde de l'image me conviens parfaitement donc cela pourrais fonctionner ?
Merci
sinon pour copier la semi-transparence il faut utiliser gdialphablend au lieu de bitblt :
en jouant sur le paramètre SourceConstantAlpha on peut même rajouter un effet de transparence de la totalité de l'image
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 dcimg4 est un entier = dDébutDessin(Image5) hdcCompatible4 est un entier = API("gdi32","CreateCompatibleDC",dcimg4) obj = API("gdi32","SelectObject",hdcCompatible4,Superbitmap.GetHbitmap(Color.Black)) blendfunc est une structure BlendOp est un octet BlendFlags est un octet SourceConstantAlpha est un octet AlphaFormat est un octet FIN monblendfunc est un blendfunc monblendfunc.BlendOp = 0 monblendfunc.BlendFlags = 0 monblendfunc.SourceConstantAlpha = 255 monblendfunc.AlphaFormat = 1 API("gdi32","GdiAlphaBlend",dcimg4,0,0,Image5..Largeur,Image5..Hauteur,hdcCompatible4,0,0, Image5..Largeur,Image5..Hauteur, monblendfunc) API("user32","InvalidateRgn",Handle(Image5),0,True) // libération des objets, contextes , bitmaps API("gdi32","DeleteObject",obj) API("gdi32","DeleteDC",hdcCompatible4) bitmapNouveau.Dispose() bitmapOriginal.Dispose() Superbitmap.Dispose()
SourceConstantAlpha = 0 -> image complètement transparente (on ne la voit plus )
SourceConstantAlpha = 128 -> image à moitié transparente
Mais... Je ne vois plus l'utilisation de System.Drawing dans ton code, c'est normal ?
c'est parce que je n'ai pas mis le code complet :
en pièce jointe ce que cela donne ( voir transition image - transparence)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Superbitmap est un "System.Drawing.Bitmap" dynamique =... allouer un "System.Drawing.Bitmap"(Image5..Largeur, Image5..Hauteur) MonGraphics est un Graphics dynamique = Graphics::FromImage(Superbitmap) MonGraphics.CompositingQuality = CompositingQuality.HighQuality MonGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic MonGraphics.SmoothingMode = SmoothingMode.HighQuality //draw the image into the target bitmap MonGraphics.DrawImage(bitmapOriginal, 0, 0, Image5..Largeur,Image5..Hauteur ) ..... .....
D'accord, merci
Je vais tenter d’accommoder tes codes dans mon appli, si j'ai un soucis, je reviens ici
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager