FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
cambiar tamaño de imagen jpg
hola amigos
Tengo una form donde cargo una imagen en un DBImage, anteriormente habia preguntado como cargar un jpg ahora lo que necesito es saber como redimensionar este jpg o sea cambiar el tamaño de la imagen en pixeles ejemplo de 800x600 a 100x100 y el tamaño en fisico ejemplo de 500 Kb a 150Kb. les dejo el código para que le hechen un ojo Gracias de antemano Código:
if(OpenDialog1->Execute()) { if (OpenDialog1->FileName == "") { if (OpenDialog1->FileName == "") { MessageDlg("Operación cancelada" , mtInformation, TMsgDlgButtons() << mbOK, 0); } else { //obtener la extension del fichero seleccionado b = OpenDialog1->FileName.Length() - 3; a = OpenDialog1->FileName.Delete(1,b); a = a.LowerCase(); if (a == "bmp" || a == "BMP") { DBImage1->Picture->LoadFromFile(OpenDialog1->FileName); } if (a == "jpg" || a == "jpeg" || a == "JPG" || a == "JPEG") { // Carga en memoria el fichero jpg->LoadFromFile(OpenDialog1->FileName); //convertir bmp->Assign(jpg); //poner convertido en la imagen DBImage1->Picture->Assign(bmp); //limpiar memoria delete jpg; delete bmp; } } } } TFileStream *File = new TFileStream(OpenDialog1->FileName, fmOpenRead); if (File->Size >= 600000) { MessageDlg("La imagen es demasiado grande, debe ser menor de 600000 bytes y su tamaño actual es " + IntToStr(File->Size) + " bytes", mtError, TMsgDlgButtons() << mbOK, 0); delete File; } else { ADOQuery2->Post(); }
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ Última edición por lmpadron fecha: 02-12-2011 a las 17:22:25. |
#2
|
|||
|
|||
Te pongo código a ver qué tal, ahí se ve como redimensionar una imagen y como comprimirla para reducir su tamaño, (aunque si la reduces de dimensiones, por lógica también reduce su tamaño).
Código:
//Usamos el bmp para redimensionar el jpg Graphics::TBitmap* bmp = new Graphics::TBitmap; TJPEGImage* jpg = new TJPEGImage; jpg->LoadFromFile( "foto.jpg" ); bmp->Height = 100; bmp->Width = 100; bmp->Canvas->StretchDraw( bmp->Canvas->ClipRect, jpg ); jpg->Assign( bmp ); //Según la compresión varia el tamaño, menor compresión, menor tamaño, pero también menor calidad de la imagen jpg->CompressionQuality = 90; jpg->Compress(); jpg->SaveToFile( "c:\\lolo.jpg" ); delete jpg; |
#3
|
||||
|
||||
Gracias _cero_ el código me funcionó perfecto
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
#4
|
||||
|
||||
Aquí les dejo el código completo por si a alguien le hace falta
Código:
void __fastcall TForm3::Button1Click(TObject *Sender) { int b; String a; //Usamos el bmp para redimensionar el jpg Graphics::TBitmap* bmp = new Graphics::TBitmap; TJPEGImage* jpg = new TJPEGImage; //Obtenemos la imagen de un OpenDialog1 en el cual fue previamente abierta jpg->LoadFromFile(OpenDialog1->FileName); //Asignamos el ancho y largo a partir de dos Edits bmp->Width = StrToInt(Edit1->Text); bmp->Height = StrToInt(Edit2->Text); bmp->Canvas->StretchDraw( bmp->Canvas->ClipRect, jpg ); jpg->Assign( bmp ); //Asignamos la compresión a partir de un TrackBar //Según la compresión varia el tamaño, menor compresión, menor tamaño, pero también menor calidad de la imagen jpg->CompressionQuality = TrackBar1->Position; jpg->Compress(); //obtener la extension del fichero seleccionado b = OpenDialog1->FileName.Length() - 3; a = OpenDialog1->FileName.Delete(1,b); a = a.LowerCase(); //Guardamos la imagen jpg->SaveToFile("CONVERTIDA-" + IntToStr(Button1->Tag)+ "." + a); delete jpg; Button1->Tag = Button1->Tag + 1; }
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
#5
|
||||
|
||||
Por favor, crea un nuevo hilo con tu consulta, no repitas lo mismo en distintos hilos si no es para responder o aportar algo al hilo existente. Gracias
|
#6
|
||||
|
||||
solo un detalle y que me corrijan si me equivoco. StretchDraw hacia que la imagen perdiera mucha calidad y en su momento, cuando yo me interesé por ese tema, me indicaron otro metodo usando las apis de windows pero ahora mismo no recuerdo como era y tendria que buscar el codigo.
|
#7
|
||||
|
||||
StretchDraw tenia un problema, restaba mucha calidad a las imagenes. En su tiempo, cuando yo me interesé por el tema, me ayudaron a hacerlo de otra forma. Os pongo un enlace con la prueba que hice donde, ademas de poder redimensionarla, tambien se puede exportar a jpg y ademas se puede arrastrar la imagen en el TImage para desplazarnos por ella sin necesidad de scrollbars. Espero que te sirva.
Enlace: https://mega.co.nz/#!NhNBXbKK!mkkwV4...EBErPlElWT0DY8 Última edición por aguml fecha: 24-09-2014 a las 14:15:47. |
#8
|
||||
|
||||
una cosa mas, creo recordar que el objeto TJPEJImage tiene una funcion para redimensionar el jpg (creo que era resize o algo asi) pero ya para para hacerlo por tamaño en bytes no se.
|
#9
|
||||
|
||||
Ya que se reabre este tema, voy a aportar una solución usando GDI+ que no tiene el inconveniente de la pérdida de calidad clásica de Stretch y usa HBITMAP con lo que se puede usar con cualquier formato de compresión. Podéis ver el código en C y delphi en este enlace: Redimensionar una imagen con GDI+ flat API.
Saludos. |
#10
|
||||
|
||||
Gracias por compartirlo
|
#11
|
||||
|
||||
muy interesante el aporte. Hace mucho tiempo usé gdi+ para capturar parte de un form y guardarlo en bmp y me fue imposible porque tenia que capturar la imagen de un componente de visual basic y no se porque me creaba la imagen vacia. Como digo, me volvi loco y no lo consegui. A ver si mañana pruevo tu codigo a ver si me funciona. Una pregunta ¿Tu metodo da mas calidad que el que yo he mandado? Otra cosa, dices que hay que inicializar el gdi+ y finalizarlo al terminar ¿Como haces eso? Y por ultimo ¿No seria mejor crear una clase para hacer mas facil su uso con los metodos de inicializar, dibujar, redimensionar, y destruir?
|
#12
|
||||
|
||||
GDI+ es una mejora sustancial de GDI, es muy posible que las últimas versiones de delphi y builder trabajen con él.
Cita:
Código:
// Inicializar GDI+. __int64 gdiplusStartupInput[3]; ULONG_PTR gdiplusToken; gdiplusStartupInput[0] = 1; gdiplusStartupInput[1] = 0; // Cerrar GDI+ GdiplusShutdown(gdiplusToken); Cita:
Saludos. Última edición por escafandra fecha: 25-09-2014 a las 02:34:58. |
#13
|
||||
|
||||
Amigo tengo un problema, haces un #pragma link "Gdiplus.lib" pero al compilar me dice que no encuentra "Gdiplus.lib" ¿como soluciono eso?
|
#14
|
||||
|
||||
Usa IMPLIB.EXE contra gdiplus.dll para crear gdiplus.lib.
También puedes importar dinámicamente las APIs Gdiplus que uses. Saludos. |
#15
|
||||
|
||||
Ok ya lo conseguí.
En un rato adjunto un mini proyecto con esto. |
#16
|
||||
|
||||
Aqui el enlace: chrome://mega/content/secure.html#!lpNiRRKY!4McmohxnApGh4xX1NYL0cvWoIw7__NQ2Eu-Qa5J4xhA
Ahora tengo varias dudas: 1. La aplicación usa la dll del GDI+ instalado en mi pc ya que no he instalado nada ahora y al añadir el .h y el .lib y sin colocar la dll en el directorio del proyecto ni ningun sitio el programa funciona correctamente. ¿de donde lee la dll? 2. La ruta al .h no está entre comillas y por lo tanto no es leido del directorio del proyecto ¿donde está ese archivo de cabecera? Lo he buscado por los directorios del C++Builder 6 y no lo veo. 3. ¿Como puedo hacer para que, adjuntando al proyecto la dll que tengo funcione usando esa dll para que no dependa de que tengan o no instalado gdi+? ¿me podeis explicar como añado la dll estaticamente usando el .lib y el .h? Yo algunas veces he añadido funciones de forma dinamica sin .lib, ni .h pero me gustaria hacerlo de forma estatica. |
#17
|
||||
|
||||
se me olvido una cuarta pregunta:
4. Cuando dibujas, al taparlo con otro form o minimizar o cualquier otra forma que se oculte lo que se dibuja, este desaparece. ¿como se haría para que no desaparezca lo que dibujas con ese metodo? |
#18
|
||||
|
||||
gdiplus.dll está aquí: C:\windows\system32\gdiplus.dll. Es parte del S.O. por lo que no se instala. Lo que puedes instalar es el Platform SDK Redistributable: GDI+ para desarrolladores. La dll no la añades de forma estática nunca, aunque existen app de terceros para extraer una librería de enlace estático. Cuando haces un enlace estático con Builder se refiere a las dll correspondientes al mismo Builder y VCL.
El código que te enseñé lo hice con API Flat para evitar el uso de Platform SDK GDI+ y obviar la librería de clases GDI+ para poder compliar en delphi7. Cuando dibujes, hazlo en el canvas de un TImage y no en el del Form. Saludos. Última edición por escafandra fecha: 26-09-2014 a las 01:07:19. |
#19
|
||||
|
||||
ok ¿Entonces no tengo que preocuparme de que la dll acompañe al proyecto? En mi pc en esa ruta no hay ningun gdiplus.dll, el que hay es gdi32.dll. Y yo no dibujé en el form, lo hice en un TPanel ¿Si lo hago sobre el canvas de un timage ya no se borra al ocultarlo?
|
#20
|
||||
|
||||
No tienes que preocuparte por esa dll.
El problema de dibujar en un control es que no lo haces como respuesta al mensaje WM_PAINT, por ese se borra. Al hacerlo en un TImage, éste ya se encarga de refrescarse a si mismo al procesar ese mensaje. Saludos. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
¿Cómo cambiar tamaño una imagen después de cargarla? | Master23 | Varios | 4 | 03-08-2010 18:37:58 |
¿Como cambiar el tamaño a una imagen? | flystar | Varios | 1 | 22-04-2010 19:23:51 |
como saber y cambiar el tamaño a una imagen | Negriz | C++ Builder | 10 | 09-06-2008 00:00:21 |
Cambiar tamaño de una imagen antes de guardar en una bd | chux | Gráficos | 6 | 28-11-2006 11:58:58 |
Cambiar el tamaño de una imagen | inter_mercadeo | Gráficos | 2 | 25-02-2005 17:43:54 |
|