No me reconoce algunos WMF
#1
Escrito 20 diciembre 2014 - 02:16
Quiero convertir unos archivos WMF a JPEG, para ello pretendo cargarlos en un TImage y exportar esa imagen a JPEG. El problema es que no funciona con mis WMF, al cargarlo en el TImage me indica que el metadata no es válido (probado tanto en Delphi 6 y Delphi 2010), a pesar de que en Windows se ven perfectamente.
http://www.clubdelph...ead.php?t=80433
Esta conversión normalmente funciona bien, solo falla con los WMF que realmente necesito convertir. Parece que Delphi (ni siquiera Delphi 2010) soporta ese versión concreta de WMF.
También he intentado hacer la conversión desde mi aplicación lanzando utilidades de línea de comando, pero las utilidades libres tampoco reconocen mis WMF :
http://www.easy2convert.com/wmf2jpg/
http://www.shibaguch...taconverte.html
Solo he encontrado una utilidad de línea de comando que reconoce y convierte mis WMF. Pero es de pago y es muy gorda (está diseñada para hacer muchas más conversiones relacionadas con archivos PDF).
http://www.verypdf.c...o-jpg-9597.html
¿ Conocéis otra forma de conseguir una conversión de archivos WMF a JPG desde una aplicación Delphi ?. He adjuntado uno de mis archivos WMF a convertir, para que lo podáis probar.
NOTA: Estos archivos WMF se crean en ese formato en un componente TRxRichEdit (un control como el editor TMemo, pero para textos con formato RTF). Y es que estoy poniendo un módulo de correo electrónico en mi aplicación, en el componente RxRichEdit permito escribir un texto enriquecido (incluyendo formato de texto e imágenes), que después transformo a HTML para enviarlo por correo como correo con texto enriquecido. El problema es que cuando inserto una imágen JPG en el editor RichEdit, al guardarlo en RTF me lo ha convertido a ese formato WMF que Delphi no sabe reconocer.
¿ Se os ocurre algo ?, gracias.
#2
Escrito 20 diciembre 2014 - 02:21
http://sourceforge.n...jects/rtf2html/
#3
Escrito 20 diciembre 2014 - 03:20
También he intentado hacer la conversión desde mi aplicación lanzando utilidades de línea de comando, pero las utilidades libres tampoco reconocen mis WMF :
http://www.easy2convert.com/wmf2jpg/
http://www.shibaguch...taconverte.html
¿ Se os ocurre algo ?, gracias.
Me parece que la forma en que se han generado tus WMF ha dejado inconclusa alguna cabecera del archivo y por ello no es tan facil de interpretar. ¿Con qué generas tus wmf?
#4
Escrito 21 diciembre 2014 - 11:49
También he intentado hacer la conversión desde mi aplicación lanzando utilidades de línea de comando, pero las utilidades libres tampoco reconocen mis WMF :
http://www.easy2convert.com/wmf2jpg/
http://www.shibaguch...taconverte.html
¿ Se os ocurre algo ?, gracias.
Me parece que la forma en que se han generado tus WMF ha dejado inconclusa alguna cabecera del archivo y por ello no es tan facil de interpretar. ¿Con qué generas tus wmf?
Los genera el componente RichEdit de Delphi (un wrapper al editor RTF de Windows). Windows los reconoce bien (al igual que componentes como HTMLTools).
NOTA: Estos archivos WMF se crean en ese formato en un componente TRxRichEdit (un control como el editor TMemo, pero para textos con formato RTF). Y es que estoy poniendo un módulo de correo electrónico en mi aplicación, en el componente RxRichEdit permito escribir un texto enriquecido (incluyendo formato de texto e imágenes), que después transformo a HTML para enviarlo por correo como correo con texto enriquecido. El problema es que cuando inserto una imágen JPG en el editor RichEdit, al guardarlo en RTF me lo ha convertido a ese formato WMF que Delphi no sabe reconocer.
#5
Escrito 21 diciembre 2014 - 06:49
Lee esto: Como guardar archivos gráficos en varios formatos.
Ejemplo para tu caso:
program Project1; uses Windows; type TCLSID = TGUID; PCLSID = ^TCLSID; TImageCodecInfo = packed record Clsid: TCLSID; FormatID: TGUID; CodecName: PWCHAR; DllName: PWCHAR; FormatDescription: PWCHAR; FilenameExtension: PWCHAR; MimeType: PWCHAR; Flags: DWORD; Version: DWORD; SigCount: DWORD; SigSize: DWORD; SigPattern: PBYTE; SigMask: PBYTE; end; PImageCodecInfo = ^TImageCodecInfo; TEncoderParameter = packed record Guid: TGUID; NumberOfValues: ULONG; Type_: ULONG; Value: Pointer; end; PEncoderParameter = ^TEncoderParameter; TEncoderParameters = packed record Count : UINT; Parameter : array[0..0] of TEncoderParameter; end; PEncoderParameters = ^TEncoderParameters; function wcscmp(wstr1, wstr2: PWCHAR): Integer; cdecl external 'crtdll'; // GDI+ Flat API... function GdiplusStartup(var GdiToken: DWORD; Startup, Output: PBYTE): Cardinal; stdcall external 'gdiplus'; procedure GdiplusShutdown(GdiToken: DWORD); stdcall external 'gdiplus'; function GdipCreateBitmapFromHBITMAP(hbm: HBITMAP; hpal: HPALETTE; var GBitmap: THANDLE): Cardinal; stdcall external 'gdiplus'; function GdipCreateHBITMAPFromBitmap(GBitmap: THANDLE; var hBitmap: HBITMAP; BKColor: DWORD): DWORD; stdcall external 'gdiplus'; function GdipGetImageEncodersSize(var numEncoders: DWORD; var size: DWORD): Cardinal; stdcall external 'gdiplus'; function GdipGetImageEncoders(numEncoders, size: DWORD; encoders: PImageCodecInfo): Cardinal; stdcall external 'gdiplus'; function GdipDisposeImage(image: THANDLE): Cardinal; stdcall external 'gdiplus'; function GdipCreateBitmapFromFile(lpFileName: PWCHAR; var GBitmap: THANDLE): DWORD; stdcall external 'gdiplus'; function GdipSaveImageToFile(image: THANDLE; FileName: PWCHAR; var clsidEncoder: TCLSID; encoderParams: Pointer): Cardinal; stdcall external 'gdiplus'; // Calidad de imagen y factor de compresión // Quality = 100 es la maxima calidad. procedure GetEncoderParameters(EP: PEncoderParameters; Quality: PULONG); const EncoderQuality: TGUID = '{1d5be4b5-fa4a-452d-9cdd-5db35105e7eb}'; begin EP.Count:= 1; EP.Parameter[0].Guid:= EncoderQuality; EP.Parameter[0].Type_:= 4; //Gdiplus::EncoderParameterValueTypeLong; EP.Parameter[0].NumberOfValues:= 1; EP.Parameter[0].Value:= Quality; end; // Obtener el CLSID para la codificación de un formato gráfico function GetEncoderClsid(Format: PWCHAR; var Clsid: TCLSID): boolean; var i, N, Size: Cardinal; ICInfo: array of TImageCodecInfo; begin i:= 0; N:= 0; Size:= 0; GdipGetImageEncodersSize(N, Size); if Size > 0 then begin SetLength(ICInfo, Size); GdipGetImageEncoders(N, Size, @ICInfo[0]); while (i<N) and (wcscmp(ICInfo[i].MimeType, Format)<>0) do inc(i); if i<N then Clsid:= ICInfo[i].Clsid; end; Result:= boolean(i<N); end; // Crea un HBITMAP desde un fichero usando GDI+ function CreateHBITMAPFromFileW(FileName: PWCHAR): HBITMAP; var GBitmap: THANDLE; begin Result:= 0; GBitmap:= 0; GdipCreateBitmapFromFile(FileName, GBitmap); GdipCreateHBITMAPFromBitmap(GBitmap, Result, 0); GdipDisposeImage(GBitmap); end; // Guarda un HBITMAP en un archivo con un formato gráfico determinado procedure SaveBitmapToFile(Bitmap: HBITMAP; FileName, Format: PWCHAR; Quality: ULONG=100); var Clsid: TCLSID; EP: TEncoderParameters; GBitmap: THANDLE; begin GetEncoderClsid(Format, Clsid); GetEncoderParameters(@EP, @Quality); GdipCreateBitmapFromHBITMAP(Bitmap, 0, GBitmap); GdipSaveImageToFile(GBitmap, FileName, Clsid, @EP); GdipDisposeImage(GBitmap); end; var gdiplusToken: DWORD; GdiPlusStartupInput: array[0..2] of int64; Bmp: HBITMAP; begin // Inicializamos GDI+. GdiPlusStartupInput[0]:= 1; GdiPlusStartupInput[1]:= 0; if GdiplusStartup(gdiplusToken, @GdiPlusStartupInput, nil) <> 0 then exit; // Creando un HBITMAP Bmp:= CreateHBITMAPFromFileW('Image1.wmf'); // Guardando un archivo jpg con calidad 50 SaveBitmapToFile(Bmp, 'Image1.jpg', 'image/jpeg', 50); // Shutdown GDI+ GdiplusShutdown(gdiplusToken); end.
Saludos.
#6
Escrito 22 diciembre 2014 - 03:35
exception class : EInvalidGraphic
exception message : Metafile is not valid.
00478079 HCLab.exe Graphics InvalidGraphic
0047809d HCLab.exe Graphics InvalidMetafile
0047b07a HCLab.exe Graphics TMetafile.ReadWMFStream
0047aeb3 HCLab.exe Graphics TMetafile.LoadFromStream
Mi impresion es que la imagen que va dentro no está muy correcta, pero no he investigado más.
Peeero, convertirlo a JPG es muy sencillo: Botón derecho, Imprimir, BullZIP PDF printer, eliges formato .JPG (en lugar de .PDF), aceptas y listo, todos convertidos en la carepta que hayas elegido (he probado con el que envias y sale una foto de hombres de negocios o algo así).
#7
Escrito 22 diciembre 2014 - 04:46
Mi Win7 no previsualiza el .wmf, al intentar "pegarlo" en mi aplicacion sale en blanco, y al importarlo (tengo un pequeño conversor que usa las API de windows con un callback por lo que no debería fallar nunca) me dice que el wmf es invalido:
exception class : EInvalidGraphic
exception message : Metafile is not valid.
00478079 HCLab.exe Graphics InvalidGraphic
0047809d HCLab.exe Graphics InvalidMetafile
0047b07a HCLab.exe Graphics TMetafile.ReadWMFStream
0047aeb3 HCLab.exe Graphics TMetafile.LoadFromStream
Mi impresion es que la imagen que va dentro no está muy correcta, pero no he investigado más.
Peeero, convertirlo a JPG es muy sencillo: Botón derecho, Imprimir, BullZIP PDF printer, eliges formato .JPG (en lugar de .PDF), aceptas y listo, todos convertidos en la carepta que hayas elegido (he probado con el que envias y sale una foto de hombres de negocios o algo así).
Mi Win8.1 si reconoce esa imagen y mi código (API GDIplus) la convierte sin ningún tipo de problema, y "como muestra, un botón".
Saludos.
Archivos adjuntos
#8
Escrito 22 diciembre 2014 - 06:10
Ahora sí que reconoce y convierte los archivos.
#9
Escrito 22 diciembre 2014 - 07:54
#10
Escrito 22 diciembre 2014 - 10:39
Será cosa del delphi7, algunas imagenes dan errores internos, sobre todo los bmp de los scanners y esas cosas.
Lo probé también con Delphi 2010 y no lo reconocía tampoco. Imagino que que el RichEdit usa internamente una versión poco común de los WMF, ya que hay bastantes programas que no lo reconocen.
Ahora estoy probando de editar el correo electrónico directamente en HTML (un WebBrowser en modo edición, des del que se lanzan comandos ExecCommand al motor MSHTML para establecer la negrita, cambiar el tipo de letra, insertar imágenes, ...), puesto que realmente la conversión de RTF a HTML deja mucho que desear.
Saludos.
#11
Escrito 28 diciembre 2014 - 12:10
WMF es un archivo de vectores al igual que AI (de Adobe Ilustrator) según leí es más como el PostScript de Unix.
Deberías ver si estos archivos que te causan problemas contienen imagenes raster internas, ya que pueden contenerlas, sono como híbridos, además el año en que fueron creados. También deberías ver si se pueden abrir desde algún otro programa además de aquel que los generó.
Yo, por las dudas los abriría desde un editor para revisar su anatomía y compararlos con aquellos que sí funcionan.
Se me ocurre solo eso.
Saludos