canal alpha memblock
| bebou007 |
Posté le 13 Déc 2009 à 21:18
|
|
![]() Messages : 238 GCPoints : 43228 |
salut voila j'ai un petit soucis pour découper mon image en title je passe pas un bitmap que je transforme en memblock puis je le convertie en image mon probleme des que je veut afficher mon image avec la transparence c'est tous qui s'efface je voudrais bien modifier le canal alpha ou voir si il et mal configure le probleme je trouve pas comment sont enregistre les donner dans le memblock si quelqun peut m'aider |
|
| Daru13 |
Posté le 13 Déc 2009 à 23:06
|
|
![]() Messages : 2884 GCPoints : 108090 |
On peux pas utiliser de PNG avec DBpro ? | |
| graphiboc |
Posté le 14 Déc 2009 à 12:05
|
|
![]() Messages : 262 GCPoints : 40352 |
salut bebou007. Pour répondre à ta question, image que tu écrives ta couleur (donc un dword) en position r de ton memblock. Alors tu peux écrire la valeur alpha (byte) à la position r+3. voilà. Bon courage pour la suite
L'Homme est un créateur...
|
|
| bebou007 |
Posté le 14 Déc 2009 à 13:10
|
|
![]() Messages : 238 GCPoints : 43228 |
salut pour daru13 oui on peut utiliser le png mais il n'y a pas de fonction pour le decouper http://nedron.schweiz149.server4you.de/download/DieKiuHelden/Chipsets/bof2.png par contre graphiboc j'ai pas trop compris se que tu voulais dire les premier dword d'une image en memblock c'est la largeur la hauteur et la profondeur mais apres c'est quoi rgbA |
|
| Darktib |
Posté le 14 Déc 2009 à 19:05
|
|
![]() Messages : 4017 GCPoints : 347288 |
Voila le format image des memblocks: [EN-TETE] Largeur (DWORD) Hauter (DWORD) Profondeur (DWORD) [DONNEES] Pour chaque pixel, c'est à dire Largeur * Hauteur: Couleur (DWORD) La couleur est stockée sous la forme Rouge Vert Blue Alpha (rgba) Attention, les pixels sont stockés par ligne. Pour avoir le pixel à la position (x;y): Code : largeur = 1024 rem juste pour l'exemple hauteur = 768 rem juste pour l'exemple rem on récupère le pointeur sur le memblock pointeur = get memblock ptr(num_memblock) rem on passe les 3 premiers DWORD, c'est à dire 3*4octets. pointeur = pointeur + 12 rem on accède au pixel (x;y) couleur_pixel as dword couleur_pixel = *( pointeur + 4 * (y * largeur + x) ) Si tu veux plus d'explications, demande le moi Au fait: pour changer un octet par un pointeur, il faut faire: Code : *pointeur_sur_les_donnees = ce_que_l_on_veut NB: un DWORD est un 'double mot', c'est à dire 4 octets (un 'mot' fait 2 octets) edit: pour le découper, c'est pas compilqué : tu te fait une fonction qui récupère la couleur d'un pixel, une qui change une couleur à partir d'une variable, et une dernière qui modifie la couleur d'un pixel dans un memblock. Essaye de les faires par toi même - mais si tu n'y arrive pas, je suis toujours là
Dernière édition le 14 Déc 2009 à 19:07
|
|
| bebou007 |
Posté le 14 Déc 2009 à 21:07
|
|
![]() Messages : 238 GCPoints : 43228 |
resalut merci pour c'est précision supplémentaire pourquoi tu utilise le pointeur alors qu'il y a des fonction pour écrire ou lire un memblock c'est plus rapide? par contre comment on peut modifier l'alpha car aucun commande db pro permet de récupère l'alpha ou écrire? si non existe il pas une fonction pour dire que tel couleur et transparente car il me semble que set image colorkey sert a sa mais sa marche pas merci encore pour les reponsses |
|
| Darktib |
Posté le 14 Déc 2009 à 21:44
|
|
![]() Messages : 4017 GCPoints : 347288 |
Les pointeurs sont plus rapides - mais à la moindre erreur, c'est la segfault (crash) assurée... Pour l'alpha: Code : rem on reprend les veriables du code précédent pointeur_sur_pixel = pointeur + 4 * (y * largeur + x) rem valeurs de couleur rouge as byte vert as byte bleu as byte alpha as byte rouge = *pointeur_sur_pixel vert = *(pointeur_sur_pixel+1) bleu = *(pointeur_sur_pixel+2) alpha = *(pointeur_sur_pixel+3) |
|
| bebou007 |
Posté le 14 Déc 2009 à 22:21
|
|
![]() Messages : 238 GCPoints : 43228 |
re bon sa marche pas lol variable existe pas (*) probleme sur rouge = *pointeur_sur_pixel vert = *(pointeur_sur_pixel+1) bleu = *(pointeur_sur_pixel+2) alpha = *(pointeur_sur_pixel+3) donc en fait je me sert de byte memblock pour récupère les valeur de rouge vert bleu et alpha et la sa marche de toute façon sa devrait être suffisamment rapide car c'est juste une image de 480*256 merci quand même pour cette aide |
|
| Darktib |
Posté le 14 Déc 2009 à 22:37
|
|
![]() Messages : 4017 GCPoints : 347288 |
variable existe pas ? Je ne t'ai pas mis tout le code, il faut créer les variables avant L'accès à la mémoire ne dépend pas de la taille de l'image. |
|
| bebou007 |
Posté le 14 Déc 2009 à 22:57
|
|
![]() Messages : 238 GCPoints : 43228 |
re ben tu a bien declarer rouge vert bleu et pointeur_sur_pixel avant Code : C++ largeur = 1024 rem juste pour l'exemple hauteur = 768 rem juste pour l'exemple rem on récupère le pointeur sur le memblock pointeur = get memblock ptr(num_memblock) rem on passe les 3 premiers DWORD, c'est à dire 3*4octets. pointeur = pointeur + 12 rem on accède au pixel (x;y) pointeur_sur_pixel as dword rem on reprend les veriables du code précédent pointeur_sur_pixel = pointeur + 4 * (y * largeur + x) rem valeurs de couleur rouge as byte vert as byte bleu as byte alpha as byte rouge = *pointeur_sur_pixel vert = *(pointeur_sur_pixel+1) bleu = *(pointeur_sur_pixel+2) alpha = *(pointeur_sur_pixel+3) je disais juste que sur mon image de 480*256 sa sera rapide de modifier mon alpha juste une fois dans mon programme en me servant des fonction memblock au lieux des pointeur bon j'ai enfin réussi a rendre le noir transparent même le rose mais quelque Default son apparue sur les toit des maison merci encore
Dernière édition le 14 Déc 2009 à 23:23
|
|
| Darktib |
Posté le 15 Déc 2009 à 21:47
|
|
![]() Messages : 4017 GCPoints : 347288 |
De rien. Par contre je me rend compte qu'il y a une erreur dans mon code: c'est pas: Code : largeur = 1024 rem juste pour l'exemple hauteur = 768 rem juste pour l'exemple rem on récupère le pointeur sur le memblock pointeur = get memblock ptr(num_memblock) mais ce qui suit: Code : rem on récupère le pointeur sur le memblock pointeur = get memblock ptr(num_memblock) largeur as dword hauteur as dword largeur = *pointeur hauteur = *(pointeur+4) pour bien prendre en compte la largeur et la hauteur de l'image du memblock. |
|
| graphiboc |
Posté le 16 Déc 2009 à 10:25
|
|
![]() Messages : 262 GCPoints : 40352 |
allez je te fais un petit code qui renvoi une image en niveaux de gris contenant le canal alpha de ton image : Code :
function canalAlpha(source_img,alpha_img)
make memblock from image 1,source_img
make memblock from image 2,source_img
sx = memblock dword(1,0)
sy = memblock dword(1,4)
for y=0 to sy-1
for x=0 to sx-1
r = 12 + (y*sx+x)*4
alpha = memblock byte(1,r+3)
write memblock dword 2,r,rgb(alpha,alpha,alpha)
next x
next y
make image from memblock alpha_img,2
delete memblock 1
delete memblock 2
endfunction
à toi de t'en inspirer pour faire ce que tu veux Ps : je viens de la taper, donc j'ai pas testé. En cas d'erreur signale le moi Edit : je viens de me rendre compte que tu avais trouvé, donc mon code est inutile apparemment
Dernière édition le 16 Déc 2009 à 10:29
L'Homme est un créateur...
|
|
| bebou007 |
Posté le 16 Déc 2009 à 13:07
|
|
![]() Messages : 238 GCPoints : 43228 |
salut lol oui j'ai déjà trouver mais merci quand même se qui me manquer c'etais comment étais gérer les données sous memblock | |



