Ver Mensaje Individual
  #1  
Antiguo 19-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
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