aguml
19-12-2014, 13:44:01
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:
void __fastcall TForm1::CopyCatImagesTo(int Option)
{
unsigned int DataHandle;
HPALETTE APalette;
unsigned short MyFormat;
const int separacion = 15;
int x=separacion,y=0;
TRect ARect, BRect;
int altoMax=0, anchoFinal=separacion;
int error;
//Solicito memoria para el bitmap que contendrá el concatenado de imagenes
Graphics::TBitmap *FullMap = new (nothrow) Graphics::TBitmap();
if(FullMap != NULL)
{
//FullMap->HandleType = 1;
//FullMap->IgnorePalette = false;
Graphics::TBitmap *Aux = new (nothrow) Graphics::TBitmap();
if(Aux != NULL)
{ //Si se obtuvo memoria correctamente...
try
{
for(int i=0; i < CheckListBox->Count; i++, 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=0; i < CheckListBox->Count; i++)
{ //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
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(BRect, Aux->Canvas, ARect);
//Le sumo el ancho de la imagen actual a x
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(FullMap, SavePictureDialog->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:
void __fastcall TForm1::Guardarimagencomo1Click(TObject *Sender)
{
int error;
if(SavePictureDialog->Execute())
{
error = GuardarImagen(Image->Picture->Bitmap, SavePictureDialog->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:
int __fastcall TForm1::GuardarImagen(Graphics::TBitmap *bmp, char *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?
La que usa el Graphics::TBitmap es esta:
void __fastcall TForm1::CopyCatImagesTo(int Option)
{
unsigned int DataHandle;
HPALETTE APalette;
unsigned short MyFormat;
const int separacion = 15;
int x=separacion,y=0;
TRect ARect, BRect;
int altoMax=0, anchoFinal=separacion;
int error;
//Solicito memoria para el bitmap que contendrá el concatenado de imagenes
Graphics::TBitmap *FullMap = new (nothrow) Graphics::TBitmap();
if(FullMap != NULL)
{
//FullMap->HandleType = 1;
//FullMap->IgnorePalette = false;
Graphics::TBitmap *Aux = new (nothrow) Graphics::TBitmap();
if(Aux != NULL)
{ //Si se obtuvo memoria correctamente...
try
{
for(int i=0; i < CheckListBox->Count; i++, 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=0; i < CheckListBox->Count; i++)
{ //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
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(BRect, Aux->Canvas, ARect);
//Le sumo el ancho de la imagen actual a x
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(FullMap, SavePictureDialog->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:
void __fastcall TForm1::Guardarimagencomo1Click(TObject *Sender)
{
int error;
if(SavePictureDialog->Execute())
{
error = GuardarImagen(Image->Picture->Bitmap, SavePictureDialog->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:
int __fastcall TForm1::GuardarImagen(Graphics::TBitmap *bmp, char *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?