Ir al contenido


Foto

No me reconoce algunos WMF


  • Por favor identifícate para responder
10 respuestas en este tema

#1 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 20 diciembre 2014 - 02:16

Hola amigos.

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.
  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 20 diciembre 2014 - 02:21

Si tenéis curiosidad, utilizo esta utilidad para convertir a HTML el RTF entrado por los usuarios desde el control RichEdit.

http://sourceforge.n...jects/rtf2html/
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

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?
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

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.


  • 0

#5 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 21 diciembre 2014 - 06:49

Prueba a usar DIPlus, que funciona bien para tu archivo.

Lee esto: Como guardar archivos gráficos en varios formatos.

Ejemplo para tu caso:




delphi
  1. program Project1;
  2.  
  3. uses
  4.   Windows;
  5.  
  6. type
  7. TCLSID = TGUID;
  8. PCLSID = ^TCLSID;
  9. TImageCodecInfo = packed record
  10.   Clsid:            TCLSID;
  11.   FormatID:          TGUID;
  12.   CodecName:        PWCHAR;
  13.   DllName:          PWCHAR;
  14.   FormatDescription: PWCHAR;
  15.   FilenameExtension: PWCHAR;
  16.   MimeType:          PWCHAR;
  17.   Flags:            DWORD;
  18.   Version:          DWORD;
  19.   SigCount:          DWORD;
  20.   SigSize:          DWORD;
  21.   SigPattern:        PBYTE;
  22.   SigMask:          PBYTE;
  23. end;
  24. PImageCodecInfo = ^TImageCodecInfo;
  25.  
  26. TEncoderParameter = packed record
  27.   Guid:          TGUID;
  28.   NumberOfValues: ULONG;
  29.   Type_:          ULONG;
  30.   Value:          Pointer;
  31. end;
  32. PEncoderParameter = ^TEncoderParameter;
  33.  
  34. TEncoderParameters = packed record
  35.   Count    : UINT;
  36.   Parameter : array[0..0] of TEncoderParameter;
  37. end;
  38. PEncoderParameters = ^TEncoderParameters;
  39.  
  40.  
  41. function  wcscmp(wstr1, wstr2: PWCHAR): Integer; cdecl external 'crtdll';
  42.  
  43. // GDI+ Flat API...
  44. function  GdiplusStartup(var GdiToken: DWORD; Startup, Output: PBYTE): Cardinal; stdcall external 'gdiplus';
  45. procedure GdiplusShutdown(GdiToken: DWORD); stdcall external 'gdiplus';
  46. function  GdipCreateBitmapFromHBITMAP(hbm: HBITMAP; hpal: HPALETTE; var GBitmap: THANDLE): Cardinal; stdcall external 'gdiplus';
  47. function  GdipCreateHBITMAPFromBitmap(GBitmap: THANDLE; var hBitmap: HBITMAP; BKColor: DWORD): DWORD; stdcall external 'gdiplus';
  48. function  GdipGetImageEncodersSize(var numEncoders: DWORD; var size: DWORD): Cardinal; stdcall external 'gdiplus';
  49. function  GdipGetImageEncoders(numEncoders, size: DWORD; encoders: PImageCodecInfo): Cardinal; stdcall external 'gdiplus';
  50. function  GdipDisposeImage(image: THANDLE): Cardinal; stdcall external 'gdiplus';
  51. function  GdipCreateBitmapFromFile(lpFileName: PWCHAR; var GBitmap: THANDLE): DWORD; stdcall external 'gdiplus';
  52. function  GdipSaveImageToFile(image: THANDLE; FileName: PWCHAR; var clsidEncoder: TCLSID; encoderParams: Pointer): Cardinal; stdcall external 'gdiplus';
  53.  
  54.  
  55. // Calidad de imagen y factor de compresión
  56. // Quality = 100 es la maxima calidad.
  57. procedure GetEncoderParameters(EP: PEncoderParameters; Quality: PULONG);
  58. const
  59.   EncoderQuality: TGUID = '{1d5be4b5-fa4a-452d-9cdd-5db35105e7eb}';
  60. begin
  61.   EP.Count:= 1;
  62.   EP.Parameter[0].Guid:= EncoderQuality;
  63.   EP.Parameter[0].Type_:= 4; //Gdiplus::EncoderParameterValueTypeLong;
  64.   EP.Parameter[0].NumberOfValues:= 1;
  65.   EP.Parameter[0].Value:= Quality;
  66. end;
  67.  
  68. // Obtener el CLSID para la codificación de un formato gráfico
  69. function GetEncoderClsid(Format: PWCHAR; var Clsid: TCLSID): boolean;
  70. var
  71.   i, N, Size: Cardinal;
  72.   ICInfo: array of TImageCodecInfo;
  73. begin
  74.   i:= 0; N:= 0; Size:= 0;
  75.   GdipGetImageEncodersSize(N, Size);
  76.   if Size > 0 then
  77.   begin
  78.     SetLength(ICInfo, Size);
  79.     GdipGetImageEncoders(N, Size, @ICInfo[0]);
  80.     while (i<N) and (wcscmp(ICInfo[i].MimeType, Format)<>0) do inc(i);
  81.     if i<N then Clsid:= ICInfo[i].Clsid;
  82.   end;
  83.   Result:= boolean(i<N);
  84. end;
  85.  
  86.  
  87. // Crea un HBITMAP desde un fichero usando GDI+
  88. function CreateHBITMAPFromFileW(FileName: PWCHAR): HBITMAP;
  89. var
  90.   GBitmap: THANDLE;
  91. begin
  92.   Result:= 0;
  93.   GBitmap:= 0;
  94.   GdipCreateBitmapFromFile(FileName, GBitmap);
  95.   GdipCreateHBITMAPFromBitmap(GBitmap, Result, 0);
  96.   GdipDisposeImage(GBitmap);
  97. end;
  98.  
  99. // Guarda un HBITMAP en un archivo con un formato gráfico determinado
  100. procedure SaveBitmapToFile(Bitmap: HBITMAP; FileName, Format: PWCHAR; Quality: ULONG=100);
  101. var
  102.   Clsid: TCLSID;
  103.   EP: TEncoderParameters;
  104.   GBitmap: THANDLE;
  105. begin
  106.   GetEncoderClsid(Format, Clsid);
  107.   GetEncoderParameters(@EP, @Quality);
  108.   GdipCreateBitmapFromHBITMAP(Bitmap, 0, GBitmap);
  109.  
  110.   GdipSaveImageToFile(GBitmap, FileName, Clsid, @EP);
  111.   GdipDisposeImage(GBitmap);
  112. end;
  113.  
  114. var
  115.   gdiplusToken: DWORD;
  116.   GdiPlusStartupInput: array[0..2] of int64;
  117.   Bmp: HBITMAP;
  118. begin
  119.   // Inicializamos GDI+.
  120.   GdiPlusStartupInput[0]:= 1; GdiPlusStartupInput[1]:= 0;
  121.   if GdiplusStartup(gdiplusToken, @GdiPlusStartupInput, nil) <> 0 then exit;
  122.  
  123.   // Creando un HBITMAP
  124.   Bmp:= CreateHBITMAPFromFileW('Image1.wmf');
  125.  
  126.   // Guardando un archivo jpg con calidad 50
  127.   SaveBitmapToFile(Bmp, 'Image1.jpg', 'image/jpeg', 50);
  128.  
  129. // Shutdown GDI+
  130.   GdiplusShutdown(gdiplusToken);
  131. end.




Saludos.
  • 0

#6 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 22 diciembre 2014 - 03:35

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í).


  • 0

#7 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

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


  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 22 diciembre 2014 - 06:10

Gracias escafandra, funciona perfectamente.

Ahora sí que reconoce y convierte los archivos.  :smiley:
  • 0

#9 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 22 diciembre 2014 - 07:54

Será cosa del delphi7, algunas imagenes dan errores internos, sobre todo los bmp de los scanners y esas cosas.
  • 0

#10 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

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.
  • 0

#11 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 824 mensajes
  • LocationMisiones, Argentina

Escrito 28 diciembre 2014 - 12:10

Puede ser que las capacidades de conversión o interpretación sean sobrepasadas, alguna porción del mismo con un formato desconocido.
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

  • 0