Annonces Google
Serveur IRC
Serveur : irc.portlane.se
Canal : #AmigaNG
Activité du Site

Pages vues depuis 25/07/2007 : 25 220 738

  • Nb. de membres 187
  • Nb. d'articles 1 270
  • Nb. de forums 19
  • Nb. de sujets 20
  • Nb. de critiques 24

Top 10  Statistiques

Index du forum »»  Création-Développement »» Datatype, Bitmap et canal Alpha : ReadPixelArray ?

Datatype, Bitmap et canal Alpha : ReadPixelArray ?#1514

3Contributeur(s)
zzd10hthellierAmiDARK
3 Modérateur(s)
K-LElwoodcorto
zzd10h zzd10hicon_post
Bonjour,
J'en appelle à la gentilesse des personnes qui connaissent ce qui touche aux manipulations graphiques sur AOS.
Je sais qu'il y en a plein içi.

Voila, je suis en train de faire un prog MUI qui affiche des images dans des objets Bitmap MUI (encore un FastBidule, par menu contextuel et recherches dans répertoire et sous-répertoires).

Je charge mes images par Datatype dans des Bitmap avec NewDTObject et SetAttrs(Im_Data_bmp,MUIA_Bitmap_Bitmap,bitmap).

Tout marche bien, je peux les changer d'échelle, etc... mais je n'arrive pas à conserver le canal Alpha même avec "MUIA_Bitmap_Transparent,0".
Pour les photos de vacances, c'est pas grave mais bon...

je me suis basé (largement) sur l'excellent tuto de Corto :
http://www.gurumed.net/index.php/Exemple_d%27affichage_d%27une_image_sur_le_Workbench

Pour le canal Alpha, il semble utiliser une struct Picture dans
http://www.gurumed.net/index.php/R%C3%A9cup%C3%A9rer_une_image_en_tant_que_buffer_RGB

mais, moi, il me faut une struct Bitmap pour MUI.

En gros, l'idée serait de voir si l'image source a un canal alpha (avec PDTA_AlphaChannel) et si oui utiliser ReadPixelArray (?) pour remettre tout comme il faut dans un Bitmap.

C'est ce ReadPixelArray mon problème...

Est-ce que qq'un a un exemple de lecture d'image par Datatype et de conservation du canal Alpha dans un Bitmap ?

Par avance, merci pour votre aide
(et de tenir compte de mon faible niveau en graph...
je sais... "si tu ne comprends pas, c'est que tu n'as pas à y toucher!")

et j'en profite :
Merci Corto pour ton boulot sur GuruMed, cela m'est vraiment utile ;-)
thellier thelliericon_post
Salut
je reponds vite d un smartphone

Regarde dans aminet/compositepoc/compositepoc.h/loadtexturepoc()

c est sense' gerer l alpha meme si je m en sers pas ici...
Malheuresement il est bien possible que certains datatypes gerent pas l alpha du tout

Alain
AmiDARK AmiDARKicon_post
Voici ma fonction interne dans l'AmiDARK Engine pour charger une image en utilisant un DataType :

[quote]// ***************************************************************************************************************
/* Chargement d'une image en utilisant les DataTypes */
struct MyPicture * LoadPicture( APTR FileName ){
struct MyPicture *pt = NULL;
Object *dto = NULL;
ULONG nb;
ULONG * AvailMethod = NULL;
struct BitMapHeader *bmh;
struct pdtBlitPixelArray bpa;
void * bpaptr = &bpa;
if ( !FileName ) return NULL;
#if defined( __amigaos4__ )
dto = IDataTypes->NewDTObject( (STRPTR)FileName,
DTA_SourceType, DTST_FILE,
DTA_GroupID, GID_PICTURE,
PDTA_DestMode, PMODE_V43,
PDTA_Remap, TRUE,
OBP_Precision, PRECISION_EXACT,
TAG_DONE );
#else
dto = NewDTObject( (STRPTR)FileName,
DTA_SourceType, DTST_FILE,
DTA_GroupID, GID_PICTURE,
PDTA_DestMode, PMODE_V43,
PDTA_Remap, TRUE,
OBP_Precision, PRECISION_EXACT,
TAG_DONE );
#endif
if ( dto != 0 ){
#if defined( __amigaos4__ )
nb = IIntuition->GetAttrs( dto, PDTA_BitMapHeader, &bmh, TAG_DONE );
#else
nb = GetDTAttrs( dto, PDTA_BitMapHeader, &bmh, TAG_DONE );
#endif
if( nb != 0 ){
int resread;
/* Allocation de la structure Picture et du buffer mémoire */
pt = AllocPicture32( bmh->bmh_Width, bmh->bmh_Height );
if ( pt != NULL ){
bpa.pbpa_PixelData = pt->Pixels;
bpa.pbpa_PixelFormat = PBPAFMT_RGBA;
bpa.pbpa_PixelArrayMod = bmh->bmh_Width * 4;
bpa.pbpa_Left = 0;
bpa.pbpa_Top = 0;
bpa.pbpa_Width = bmh->bmh_Width;
bpa.pbpa_Height = bmh->bmh_Height;
#if defined( __amigaos4__ )
AvailMethod = IDataTypes->GetDTMethods( dto );
if ( IDataTypes->FindMethod( AvailMethod, PDTM_READPIXELARRAY ) != 0 ){
bpa.MethodID = PDTM_READPIXELARRAY;
resread = IIntuition->IDoMethodA( dto, bpaptr );
}else{
DebugMessage( debugDEImage, "Method PDTM_READPIXELARRAY not compatible with object.\n", 0 );
}
#else
AvailMethod = GetDTMethods( dto );
if ( FindMethod( AvailMethod, PDTM_READPIXELARRAY ) != 0 ){
bpa.MethodID = PDTM_READPIXELARRAY;
resread = DoMethodA( dto, bpaptr );
}else{
DebugMessage( debugDEImage, "Method PDTM_READPIXELARRAY not compatible with object.", 0 );
}
#endif
}else{
DebugMessage( debugDEImage, "Cannot allocate memory for internal picture structure.\n", 0 );
}
}else{
DebugMessage( debugDEImage, "Informations cannot be read from image file.\n", 0 );
}
#if defined( __amigaos4__ )
IIntuition->DisposeObject( dto );
#else
DisposeObject( dto );
#endif
}else{
DebugMessage( debugDEImage, "Unable to load the image file.\n", 0 );
}
return pt;
}
[/quote]

Si cela peut t'aider....
zzd10h zzd10hicon_post
Merci beaucoup,

AmiDark :
tu sembles utiliser une struct Picture (comme Corto) et il me faut une struct Bitmap.

Thellier :
Je viens de regarder vite fait et tu sembles utiliser une Bitmap => Yes !!!

Je sens que cela va être chaud mais je vais tenter,
merci encore.

zzd10h zzd10hicon_post
Euh...Alain,

quand tu fais
IDoMethod(dtype,
PDTM_READPIXELARRAY,
renderInfo.Memory,
PBPAFMT_ARGB,
srcBytesPerRow,
0,
0,
x,
y);

tu as une copie de l'objet datatype dans renderInfo.Memory, c'est cela ?
Mais après, comment fais tu pour le remettre dans un Bitmap ?

J'ai essayé avec BltBitMapTags mais je dois me planter (et ne pas savoir m'en servir)...

Merci, par avance, pour ton aide

Edit :
Ou alors il faut que j'essaye

BltBitmapTags(
BLITA_Source,&renderInfo.Memory,BLITA_SrcType,BLITT_ARGB32,
BLITA_Dest,nouveauBitmap,BLITA_DestType,BLITT_BITMAP,
BLITA_UseSrcAlpha, TRUE,...)

Encore de beaux freezes de mon système en perspectives demain soir :)


Message édité par : zzd10h / 03-04-2013 01:09
thellier thelliericon_post
RenderInfo.memory EST la bitmap (un pointeur sur ses pixels)
zzd10h zzd10hicon_post
Merci Alain,
renderInfo.Memory est une struct Bitmap ?

j'ai pourtant essayé

SetAttrs(Im_Data_full_bmp, MUIA_Bitmap_Width, width,MUIA_Bitmap_Height, height, MUIA_Bitmap_UseFriend, TRUE, MUIA_Bitmap_Bitmap, renderInfo.Memory, TAG_DONE)

avec
MUIA_Bitmap_Bitmap, renderInfo.Memory
et
MUIA_Bitmap_Bitmap, &renderInfo.Memory

mais freeze dans les 2 cas...

zzd10h zzd10hicon_post
Alain :
Si tu as 5 minutes, pourrais-tu, stp, jeter un oeil à ce code voir si qq chose te choque ?

j'ai essayé 2 trucs

1) Avec PDTA_DestBitMap pour allouer le Bitmap

2) Avec p96AllocBitMap pour allouer le Bitmap

http://zzd10h.amiga-ng.org/Divers/Bitmap_Alpha.txt

Par avance, merci ;)
thellier thelliericon_post
&Bitmap_vignette est le ptr de structure bitmap a utiliser
et
renderinfo.memory est juste l adresse des pixels de bitmap_Vignette

zzd10h zzd10hicon_post
Dis-le moi, si j'abuse...
dans les 2 exemples ci-dessous, cela devrait marcher si j'utilise bitmap_vignette, non ?
Le principe est-il bon ?

http://zzd10h.amiga-ng.org/Divers/Bitmap_Alpha.txt
Petites Annonces

0 annonce(s) publiée(s)

Consulter

AmigaOS 4.1

Laissez-vous tenter par
AmigaOS 4.1
AmiTheme

AmiTheme