| aguml |
19-12-2014 13:44:01 |
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 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:
Código PHP:
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:
Código PHP:
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?
|