La Web del Programador: Comunidad de Programadores
 
    Pregunta:  32935 - GUARDAR ARCHIVOS EN FORMATO .JPG O .GIF
Autor:  Francisco López
Tengo una imagen cargada en un control Image pero quiesera guardarla en el disco en un formato .JPG o .GIF de tal forma que no consuma mucho espacio, puesto que existe una función SavePicture() que guarda los archivos pero en formato .BMP y quiesiera que desde mi aplicación se guarde en un formato pequeño... Gracias.

  Respuesta:  Francisco López
Con el siguiente código se soluciona el problema:

En un formulario:

Private Sub Commad1_Click()
ConvertToJPEG Archivo.BMP, Archivo.JPG
End Sub

En un Módulo:

Declare Function bmpinfo Lib "VIC32.DLL" (ByVal Fname As String, bdat As BITMAPINFOHEADER) As Long
Declare Function allocimage Lib "VIC32.DLL" (image As imgdes, ByVal wid As Long, ByVal leng As Long, ByVal BPPixel As Long) As Long
Declare Function loadbmp Lib "VIC32.DLL" (ByVal Fname As String, desimg As imgdes) As Long
Declare Sub freeimage Lib "VIC32.DLL" (image As imgdes)
Declare Function convert1bitto8bit Lib "VIC32.DLL" (srcimg As imgdes, desimg As imgdes) As Long
Declare Sub copyimgdes Lib "VIC32.DLL" (srcimg As imgdes, desimg As imgdes)
Declare Function savejpg Lib "VIC32.DLL" (ByVal Fname As String, srcimg As imgdes, ByVal quality As Long) As Long

' Image descriptor

Type imgdes
ibuff As Long
stx As Long
sty As Long
endx As Long
endy As Long
buffwidth As Long
palette As Long
colors As Long
imgtype As Long
bmh As Long
hBitmap As Long
End Type

Type BITMAPINFOHEADER
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type

Public Sub ConvertToJPEG(bmp_fname As String, jpg_fname As String, Optional quality As Long)
Dim tmpimage As imgdes ' Image descriptors
Dim tmp2image As imgdes
Dim rcode As Long
Dim vbitcount As Long
Dim NO_ERROR
Dim bdat As BITMAPINFOHEADER ' Reserve space for BMP struct

NO_ERROR = 0
If quality = 0 Then quality = 75

' Get info on the file we're to load
rcode = bmpinfo(bmp_fname, bdat)

If (rcode <> NO_ERROR) Then
MsgBox "Error: en el archivo de Origen"
Exit Sub
End If

vbitcount = bdat.biBitCount
If (vbitcount >= 16) Then vbitcount = 24 ' 16-, 24-, or 32-bit image is loaded into 24-bit buffer

' Allocate space for an image
rcode = allocimage(tmpimage, bdat.biWidth, bdat.biHeight, vbitcount)

If (rcode <> NO_ERROR) Then
MsgBox "Error: Memoria insuficiente"
Exit Sub
End If

' Load image
rcode = loadbmp(bmp_fname, tmpimage)

If (rcode <> NO_ERROR) Then
freeimage tmpimage ' Free image on error
MsgBox "Error: No se pudo cargar el archivo"
Exit Sub
End If

If (vbitcount = 1) Then ' If we loaded a 1-bit image, convert to 8-bit grayscale
' because jpeg only supports 8-bit grayscale or 24-bit color images
rcode = allocimage(tmp2image, bdat.biWidth, bdat.biHeight, 8)
If (rcode = NO_ERROR) Then
rcode = convert1bitto8bit(tmpimage, tmp2image)
freeimage tmpimage ' Replace 1-bit image with grayscale image
copyimgdes tmp2image, tmpimage
End If
End If

' Guardar la imagen en Formato JPG
rcode = savejpg(jpg_fname, tmpimage, quality)

freeimage tmpimage
Kill bmp_fname
End Sub

  Respuesta:  Juan Véliz
La verdad con VB no lo puedes hacer, ademas JPG y GIF son formatos propietarios y si hicieras una aplicacion tendrias que pagar por hacerlo..

Lo mejor que puedes hacer es comprar o bajar algun componente gratuito que te permita hacerlo, dejame decirte que si lo compras no es nada barato.

Si no tienes dinero lo mejor es dejarlo como BMP

Si tienes aqui hay una direccion

www.leadtools.com


O sino busca por "Imaging Components"

Bueno mi respuesta no soluciona tu problema

Saludos