 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Jue 14 Nov, 2013 9:23 am Asunto: Es posible Usar Imagen Gif rotando como proceso en espera |
|
|
Hola
Trabajo en CB6 y se me ha ocurrido que mientras el programa realiza una operacion larga sustituir la tipica barra de espera por una imagen como esta
[img]https://app.box.com/s/54qhbb7wu6gztnnyw0fr[/img]
rotando.
Implementando el codigo siguiente el resultado se aproxima a lo que quiero
| Código: | void __fastcall TTFEspera::FormActivate(TObject *Sender)
{
for(int i=1;i<???;i++)
{
Rotar();
for(int i=1;i<50000000>Picture->Bitmap = NULL;
Application->ProcessMessages();
}
}
void TTFEspera::Rotar()
{
Graphics::TBitmap *bmpOriginal = new Graphics::TBitmap();
//bmpOriginal->LoadFromResourceName(0,"bmpcrug");
bmpOriginal->LoadFromFile("Reloj.bmp");
Img->Picture->Assign(bmpOriginal);
Graphics::TBitmap *bmpCopy = new Graphics::TBitmap();
bmpCopy->Width = bmpOriginal->Height;
bmpCopy->Height = bmpOriginal->Width;
int wOr = bmpOriginal->Width, hOr = bmpOriginal->Height;
for(int x = 0; x < wOr; x++)
{
for(int y = 0; y <hOr>Canvas->Pixels[hOr - y][x] = bmpOriginal->Canvas->Pixels[x][y];
}
}
bmpCopy->SaveToFile("Dibujo.bmp");
delete bmpOriginal; bmpOriginal=NULL;
delete bmpCopy; bmpCopy = NULL;
Application->ProcessMessages();
}
|
Pero resultaria mucho mas estetico si la imagen en vez de un bmp fuera un GIF Transparente
Buscando he encontrado que Leo(como no ) ha implementado una forma de cargar un Gif en un TIMAGEN
https://cppbuilder.es/viewtopic.php?t=4260&highlight=cargar+gif+timage
Mi pregunta:es posible Girar (y guardar la imagen girada) con la imagen Gif como hago con la imagen bmp..
Gracias |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 14 Nov, 2013 11:04 am Asunto: |
|
|
Hya un elemento en las paletas de Builder que es el TAnimate que vale para mostrar un AVI. ¿Por qué no pruebas con él? En la red es fácil encontrar recursos con animaciones de relojes, por ejemplo. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Comodin Cdt

Registrado: 07 Mar 2011Mensajes: 21
|
Publicado: Jue 14 Nov, 2013 12:31 pm Asunto: |
|
|
| Gracias por contestar..estudiare el tema. |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Mie 05 Feb, 2014 11:04 am Asunto: |
|
|
Buenas...
He retomado el tema de girar un gif transparenete cargado en un TImage y he gado a un callejon sin salida (para mi).. El planteamiento es el siguiente cargo una imagen gif en un Timage (gracias Leo) lo roto 90º (gracias otra vez Leo) guardo la imagen rotada con el mismo nombre, la cargo en el Timage,la roto y asi sucesivamente...
La primera parte funciona o eso creo...
While...
{
pathFich = pathFich + "RelojTemp.gif";
CargarImagen(img,pathFich);
RotarImagen(img, true)
Img->Picture->Assign(NULL);
}
| Código: |
////////////////////////////////////////////////
//CARGAR GIF TRANSPARENTE (LEO)
void TTFEspera::CargarImagen(TImage *imagen,String nombreFichero)
{
// Formatos: BMP, GIF, JPG, ICO, EMF, WMF
HRESULT hr = S_OK;
const int HIMETRIC_INCH = 2540;
IPicture *pPicture = NULL;
hr =:: OleLoadPicturePath( StringToOleStr(nombreFichero),
NULL, 0, 0, IID_IPicture, (void**)&pPicture);
if(FAILED(hr))
{
AnsiString pathApp = ExtractFilePath(Application->ExeName);
nombreFichero = pathApp+"Img\\xxxxxx.gif";
OleLoadPicturePath( StringToOleStr(nombreFichero),
NULL, 0, 0, IID_IPicture, (void**)&pPicture);
}
// Carga la imagen en el TImage
if (pPicture)
{
imagen->Picture = NULL;
long ancho, alto;
pPicture->get_Width(&ancho);
pPicture->get_Height(&alto);
imagen->Picture->Bitmap->Width = MulDiv(ancho,
GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSX),
HIMETRIC_INCH);
imagen->Picture->Bitmap->Height = MulDiv(alto,
GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSY),
HIMETRIC_INCH);
RECT rect = imagen->ClientRect;
pPicture->Render(imagen->Canvas->Handle, 0, 0,
imagen->Picture->Bitmap->Width, imagen->Picture->Bitmap->Height,
0, alto, ancho, -alto, &rect);
pPicture->Release();
//Centro Imagen
imagen->Left = 0;
imagen->Top = 0;
}
/////////////////////////////////
//rOTAMOS IMAGEN GIF (LEO)
void TTFEspera::RotarImagen(TImage* imagen, bool haciaDerecha)
{
std::auto_ptr<Graphics> bmpDest(new Graphics::TBitmap);
Graphics::TBitmap* bmpOrig = imagen->Picture->Bitmap;
bmpOrig->PixelFormat = pf24bit;
bmpDest->PixelFormat = pf24bit;
bmpDest->Width = bmpOrig->Height;
bmpDest->Height = bmpOrig->Width;
for (int y = 0; y <bmpOrig>Height; y++)
{
RGBTRIPLE* ptrOrig = static_cast<RGBTRIPLE>(bmpOrig->ScanLine
[y]);
for (int x = 0; x <bmpOrig>Width; x++)
{
RGBTRIPLE* pixelOrig = ptrOrig + x;
RGBTRIPLE* ptrDest;
RGBTRIPLE* pixelDest;
if (haciaDerecha)
{
ptrDest = static_cast<RGBTRIPLE>(bmpDest->ScanLine[x]);
pixelDest = ptrDest - y + bmpOrig->Height - 1;
}
else
{
ptrDest = static_cast<RGBTRIPLE>(
bmpDest->ScanLine[bmpOrig->Width-x-1]);
pixelDest = ptrDest + y;
}
*pixelDest = *pixelOrig;
}
}
imagen->Picture->Bitmap->Assign(bmpDest.get());
bmpDest->SaveToFile("RelojTemp.gif");
delete bmpOrig; bmpOrig = NULL;
Application->ProcessMessages();
} |
La primera vez que realiza la accion en el bucle actua correctamente paso a paso incluso graba la nueva imagen gif (rotada)...
El problema surge al liberar el TImage para volver a realizar las operaciones (salta el error)...
Alguna idea...Si no es mucho perdir me gustaria rotar la imagen en vez de 90 en 90 grados, en otro intervalo (45º-45º,25º-25º...) es posible
GRACIAS |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 05 Feb, 2014 11:17 am Asunto: |
|
|
Sólo una pregunta: La penúltima línea (delete bmpOrig; bmpOrig = NULL; ) ¿no te da error? Tal como la tienes al hacer el final (bmpOrig = NULL;) debería decirte que la variable no existe. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Mie 05 Feb, 2014 12:23 pm Asunto: |
|
|
Hola..
No me da error, es mas siempre que que elimino un puntero lo hago de esta manera, de hecho el no hacerlo asi me ha dado problemas en algunas ocasiones. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 06 Feb, 2014 12:16 am Asunto: |
|
|
Existen componentes para visualizar imágenes y animaciones Gif. Hace unos años yo mismo escribí una que llamé TGifViewer y que ouedes encontrar aquí. Posiblemente reuna las características que pretendes. Está escrito con Builder 5 y delphi 7.
Saludos. |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Jue 06 Feb, 2014 9:15 am Asunto: |
|
|
| Muchisimas gracias escafandra , los probare. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|