Rubrique : 2 - Windev 7x Sujet : Explorateur d'image (browser) |
Auteur |
Message |
Romain PETIT |
Posté le : 29/03/2003 22:55:23
Salut,
il y a un petit SDK MS pour l'acquisition d'image (pour COM+, XP SP1 uniquement).
C'est une DLL très intéressante pour le traitement des images.
Je m'en suisi servi très recemment pour convertir en automatique des BMP en TIF. Ultra simple et très rapide et il y a des exemples en VB (rotations, conversions,...)
Voici l'adresse où télécharger :
http://minilien.com/?iwhupNe2ZV
Et voici à quoi ressemble le code WD75 pour la conversion (sans même avoir besoin d'un champ image) :
wiaFormatTIFF est une chaîne ASCIIZ sur
255="{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
oFichierImage est un objet automation dynamique
oProcessImage est un objet automation dynamique
oFichierImage = allouer un objet automation "WIA.ImageFile"
oProcessImage = allouer un objet automation "WIA.ImageProcess"
oFichierImage>>LoadFile("E:\Documents\Mes images\Logo.bmp")
oProcessImage>>Filters>>Add(oProcessImage>>FilterInfos("Convert")>>FilterID)
oProcessImage>>Filters(1)>>Properties("FormatID")>>Value = wiaFormatTIFF
oFichierImage = oProcessImage>>Apply(oFichierImage)
oFichierImage>>SaveFile("E:\Documents\Mes images\Logo.tif")
Pas mal non ? Dommage que cela ne marche que sous XP...
A+
|
°¨¨ JL ¨¨° |
Posté le : 30/03/2003 01:32:53
Salut,
Effectivement ça a l'air sympa comme truc, mais comme c'est juste pour xp...
Une autre solution consiste à utiliser le gdi+ avec la dll à downloader chez microsoft. Je viens de le faire, et apparement c'est assez facile à utiliser. Au niveau image, les BMP, ICON, GIF, JPEG, Exif, PNG, TIFF, WMF et EMF sont gérés.
KPiTN, avant l'appel à toutes fonctions de gdiplus, faut faire un GdiplusStartup...
Le résultat des fonctions ne correspond pas aux erreurs windows mais à un status, si c'est égal à zéro alors c'est bon.
Je vais regarder ça d'un peu plus près
A+
|
KPiTN |
Posté le : 31/03/2003 17:22:37
Bon Alors je reprends ce que j'ai fait je pense pas etre tres loin, mais j'ai un pb
Token est un entier
testDLL est un entier
gdiplusstartout est un Variant
gdiplusstartupInput est une structure
gdiplusversion est un entier
debugeventcallback est un entier
suppressbackgroundthread est un booléen
suppressexternalcodecs est un booléen
FIN
MaStructure est un gdiplusstartupInput
MaStructure:gdiplusversion =1
MaStructure:debugeventcallback = Null
MaStructure:suppressbackgroundthread=0
MaStructure:suppressexternalcodecs=0
ChargeDLL("gdiplus.dll")
gdiplusstartout=Null
testDLL=AppelDLL32("gdiplus.dll","GdiplusStartup",Token,MaStructure,gdiplusstartout)
Et la y a un paremetre qu'il apprecie pas ...
Vous avez appelé la fonction AppelDLL32.
Le passage du paramètre 4 a provoqué une erreur.
Types incompatibles durant une affectation.
J'ai essayer sans le testDLL :
AppelDLL32("gdiplus.dll","GdiplusStartup",Token,MaStructure,gdiplusstartout)
et pareil ... snif
|
KPiTN |
Posté le : 31/03/2003 17:36:40
Euh autant pour moi :
AppelDLL32("gdiplus.dll","GdiplusStartup",&Token,&MaStructure,gdiplusstartout)
ca passe, il reste plus qu'a trouver comment j'utilise multibytetowidechar :)
|
°¨¨ JL ¨¨° |
Posté le : 01/04/2003 13:44:32
Re,
fic_a est une chaine asciiz de 256 = "c:\tonimage.tiff"
fic_u est une chaine asciiz de 512
api("kernel32","MultiByteToWideChar" , 0 , 0 , &fic_a , -1 , &fic_u , dimension(fic_u) )
himage est un entier sur 4 octets
api("gdiplus",GdipLoadImageFromFile", &fic_u , &himage)
A+
|
KPiTN |
Posté le : 01/04/2003 14:45:59
Token est un entier
gdiplusstartout est un Variant
gdiplusstartupInput est une structure
gdiplusversion est un entier
debugeventcallback est un entier
suppressbackgroundthread est un booléen
suppressexternalcodecs est un booléen
FIN
MaStructure est un gdiplusstartupInput
MaStructure:gdiplusversion =1
MaStructure:debugeventcallback = Null
MaStructure:suppressbackgroundthread=False
MaStructure:suppressexternalcodecs=False
ChargeDLL("gdiplus.dll")
gdiplusstartout=Null
API("gdiplus.dll","GdiplusStartup",&Token,&MaStructure,gdiplusstartout)
fic_a est une chaîne ASCIIZ de 256 = "c:\MSI.jpg"
fic_u est une chaîne ASCIIZ de 512
API("kernel32","MultiByteToWideChar" , 0 , 0 , &fic_a , -1 , &fic_u , Dimension(fic_u) )
himage est un entier sur 4 octets
AppelDLL32("gdiplus.dll","GdipLoadImageFromFile",&fic_u,&himage)
Width est un entier
AppelDLL32("gdiplus.dll","GdipGetImageWidth",himage,&Width)
Trace(Width)
Et voila j'ai ma largeur ca roule THX JL
|
KPiTN |
Posté le : 01/04/2003 16:06:11
et maintenant autre probleme :)
je veux faire une rotation et sauver l'image :
Pour le debut meme code qu'avant :
AppelDLL32("gdiplus.dll","GdipLoadImageFromFile",&fic_u,&himage)
encoderClsid est un Variant
AppelDLL32("gdiplus.dll","GdipImageRotateFlip",himage,"45")
AppelDLL32("gdiplus.dll","GetEncoderClsid","image/jpeg",&encoderClsid)
AppelDLL32("gdiplus.dll","GdipSaveImageToFile",himage,fic_u,encoderClsid,0)
Il me dit erreur sur la ligne GetEncoderClsid
apparemment le encoderClsid est une structure speciale mais j'ai pas trouver comment la declarer ...
|
KPiTN |
Posté le : 01/04/2003 16:34:24
Que vois je un moyen pour recuperer Cslid :
int CMiniProjectView::GetEncoderClsid
(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array
// in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1;
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1;
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1;
}
Deja rien qua la première fonction j'y arrive pas :
AppelDLL32("gdiplus.dll","GetImageEncodersSize",&num,&size)
Pas de fonction GetImageEncodersSize dans Gdiplus.dll , snif j'aurais essayé
|
°¨¨ JL ¨¨° |
Posté le : 12/04/2003 19:38:17
Salut KPiTN,
J'ai fais une petite classe pour ce que tu veux faire, voir page download
A+
|
KPiTN |
Posté le : 15/04/2003 15:20:30
GG, vraiment super
Je vais pouvoir faire tout ce que je voulais, meme tester les images vignettes
Encore une fois Merci JL
|