Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Problemas con la libreria FreeImage y Graphics::TBitmap

Pues amigos mi problema es que uso esa libreria para convertir imagenes bmp a otros formatos y si uso para ello un TImage y guardo esa imagen y luego uso las funciones de FreeImage para convertir la imagen pues va genial pero si en vez de un TImage uso un Graphics::TBitmap y creo la imagen con el y luego intento convertir ese archivo me falla la funcion de la libreria aunque sean ambas .bmp.

La que usa el Graphics::TBitmap es esta:
Código PHP:
void __fastcall TForm1::CopyCatImagesTo(int Option)
{
   
unsigned int DataHandle;
   
HPALETTE APalette;
   
unsigned short MyFormat;
   const 
int separacion 15;
   
int x=separacion,y=0;
   
TRect ARectBRect;
   
int altoMax=0anchoFinal=separacion;
   
int error;

   
//Solicito memoria para el bitmap que contendrá el concatenado de imagenes
   
Graphics::TBitmap *FullMap = new (nothrowGraphics::TBitmap();

   if(
FullMap != NULL)
   {
      
//FullMap->HandleType = 1;
      //FullMap->IgnorePalette = false;
      
Graphics::TBitmap *Aux = new (nothrowGraphics::TBitmap();

      if(
Aux != NULL)
      { 
//Si se obtuvo memoria correctamente...
         
try
         {
            for(
int i=0CheckListBox->Counti++, anchoFinal += separacion)
            {
               
//Meto cada imagen en su Bitmap
               
Aux->LoadFromFile(ChangeFileExt(CheckListBox->Items->Strings[i],".bmp"));
               
anchoFinal += Aux->Width;
               if(
altoMax Aux->Height)
                  
altoMax Aux->Height;
            }

            
FullMap->Height altoMax;
            
FullMap->Width anchoFinal;

            for(
int i=0CheckListBox->Counti++)
            { 
//Si se obtuvo memoria correctamente...
               //Meto cada imagen en su Bitmap
               
Aux->LoadFromFile(ChangeFileExt(CheckListBox->Items->Strings[i],".bmp"));

               
//Le sumo el ancho de la imagen actual a y
               
+= Aux->Width;

               
//Relleno el TRect para la imagen actual
               
ARect.Left 0;
               
ARect.Top 0;
               
ARect.Right Aux->Width;
               
ARect.Bottom Aux->Height;

               
//Relleno el TRect para la imagen concatenada
               
BRect.Left x;
               
BRect.Top 0;
               
BRect.Right y;
               
BRect.Bottom Aux->Height;

               
// Añado el canvas a la imagen que contendrá el concatenado de imagenes
               
FullMap->Canvas->CopyRect(BRectAux->CanvasARect);

               
//Le sumo el ancho de la imagen actual a x
               
+= Aux->Width separacion;
            }

            if(
Option == COPY_TO_CLIPBOARD)
            {
               
// generate a clipboard format, with data and palette
               
FullMap->SaveToClipboardFormat(MyFormat,DataHandle,APalette);

               
// save the data to the clipboard using that format and
               // the generated data
               
Clipboard()->SetAsHandle(MyFormat,DataHandle);
            }
            else if(
Option == SAVE_TO_FILE)
            {
               if(
SavePictureDialog->Execute())
               {
                  
error GuardarImagen(FullMapSavePictureDialog->FileName.c_str());

                  switch(
error)
                  {
                     case 
0:
                        
Application->MessageBoxA("La imagen se guardó correctamente.""Informacion"MB_OK MB_ICONINFORMATION MB_APPLMODAL);
                        break;

                     case -
1:
                        
Application->MessageBoxA("La extension introducida no es correcta.""Error"MB_OK MB_ICONERROR MB_APPLMODAL);
                        break;

                     default:
                        
Application->MessageBoxA("La extension introducida no es correcta.""Error"MB_OK MB_ICONERROR MB_APPLMODAL);
                  }
               }
            }

            
delete Aux;
            
delete FullMap;
         }
         catch(...)
         { 
//Si huvo algun error libero toda la memoria obtenida
            
delete Aux;
            
delete FullMap;
            
Application->MessageBoxA("Hubo un error al copiar las imagenes concatenadas al portapapeles""Error"MB_OK MB_ICONERROR);
         }
      }else{ 
//Si no se pudo obtener la memoria suficiente...
         //Libero toda la memoria obtenida
         
delete FullMap;
         
Application->MessageBoxA("Hubo un error al copiar las imagenes concatenadas al portapapeles""Error"MB_OK MB_ICONERROR);
      }
   }else{
      
Application->MessageBoxA("Hubo un error al copiar las imagenes concatenadas al portapapeles""Error"MB_OK MB_ICONERROR);
   }

La que usa el TImage es esta:
Código PHP:
void __fastcall TForm1::Guardarimagencomo1Click(TObject *Sender)
{
   
int error;

   if(
SavePictureDialog->Execute())
   {
      
error GuardarImagen(Image->Picture->BitmapSavePictureDialog->FileName.c_str());

      switch(
error)
      {
         case 
0:
            
Application->MessageBoxA("La imagen se guardó correctamente.""Informacion"MB_OK MB_ICONINFORMATION MB_APPLMODAL);
            break;

         case -
1:
            
Application->MessageBoxA("La extension introducida no es correcta.""Error"MB_OK MB_ICONERROR MB_APPLMODAL);
            break;

         default:
            
Application->MessageBoxA("La extension introducida no es correcta.""Error"MB_OK MB_ICONERROR MB_APPLMODAL);
      }
   }

Esta es la funcion encargada de llamar a la funcion que convierte la imagen:
Código PHP:
int __fastcall TForm1::GuardarImagen(Graphics::TBitmap *bmpchar *name)
{
   
FREE_IMAGE_FORMAT formatoSalida;
   
AnsiString extension;
   
AnsiString fileAux;
   
int retval = -2;

   
fileAux ChangeFileExt(name".bmp");
   
bmp->SaveToFile(fileAux);
   
extension ExtractFileExt(name).UpperCase();
   if(
extension != NULL)
   {
      
formatoSalida SaberFormatoImagen(extension);

      if(
formatoSalida == FIF_BMP)
      {
         
retval 0;
      }
      else if(
formatoSalida != FIF_BMP && formatoSalida != FIF_UNKNOWN)
      {
         
ConvertirImagen(fileAux,
                         
formatoSalida,
                         
extension,
                         
0);
         
DeleteFile(fileAux);
         
retval 0;
      }
      else
      {
         
retval = -1;
      }
   }
   else
   {
      
retval = -1;
   }
   return 
retval;

Son diferentes ya que una guardaria una imagen en concreto y la otra guardaria todas las imagenes concatenadas en una sola imagen.
En la de concatenar la parte del portapapeles funciona bien pero la de guardar a archivo solo funciona bien si lo guardo en formato .bmp ya que es el unico que no convierto.
¿Como puedo solucionar eso?
Responder Con Cita
  #2  
Antiguo 19-12-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
No tengo el gusto de haber trabajado con esa librería, pero si con la conversión de formatos con GDIplus (Extensión del GDI de Windows).
Te aconsejo la lectura de estos enlaces:

Leer archivos graficos en varios formatos.
Como guardar archivos gráficos en varios formatos.
Leer archivos gráficos multipágina en varios formatos
Escribir archivos gráficos multipágina


Saludos.
Responder Con Cita
  #3  
Antiguo 19-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Está muy bien tu codigo para hacer las conversiones con las GDI pero lo que pasa es que la aplicacion sobre la que estoy trabajando ya usa la dll FreeImage para otras cosas y poner mas codigo cuando ya tengo una dll que lo hace lo veo innecesario. Lo que necesito es saber donde está el fallo aunque me quedo con tu codigo para otra ocasion .
Mira lo que puedo ver entre la que me lo crea bien y la que me da error:
http://postimg.org/image/qsstjp62x/
Cambian algunas cosas pero he intentado hacer que la que falla llegue con los mismos valores pero ni por esa funciona.

Última edición por aguml fecha: 19-12-2014 a las 15:54:58.
Responder Con Cita
  #4  
Antiguo 19-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
lo solucioné. Al parecer me lié y el que funcionaba era el de la imagen de arriba y el que fallaba era el de abajo. Le puse la propiedad PixelFormat como pf8bit y ya hace la conversion sin problemas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TBitmap + SetSize marcelocarazas Varios 2 11-11-2014 17:13:24
F2051 Unit ImgList was compiled with a different version of Graphics.TBitmap Xana Gráficos 0 13-03-2007 17:44:51
Problema con tbitmap chux Gráficos 2 09-06-2006 18:11:19
Unit JPEG compiled witha diff. version of Graphics luisdevis Varios 0 08-10-2004 23:39:32
Problemas con libreria RX anay Varios 2 18-12-2003 15:18:55


La franja horaria es GMT +2. Ahora son las 11:26:23.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi