Newsgroup: it.comp.lang.visual-basic
Titolo: [?] BMP ---> ogni altra cosa + piccola

Ok, non assalitemi subito.
Il formato BMP crea file troppo grandi (c'è di mezzo il disco, ma anche e
soprattutto il tempo necessario per spedire tali allegati con una mail e un
normale modem). Ho cercato in MSDN, sull'archivio di NG-VB su Google e sul
SC e mi pare di aver capito che i vari GIF, JPEG, etc. sono formati
"proprietari" che necessitano di licenze/librerie/OCX, insomma di qualcosa
che non è puro (e free) codice sorgente, per lungo che possa essere.
Non ho intenzione di interpretare una BMP per trasformarla in un altro
formato, anche perchè, riproducendo l'artificio, andrei incontro agli stessi
problemi di copyright.
Però, visto che Paint sta su tutte le macchine Win e riesce tranquillamente
a salvare un BMP in GIF (e per questo, forse, M$ avrà pagato una licenza)
con una definizione (per i miei scopi) più che sufficiente, mi chiedevo se
può avere un senso e se è praticabile passare (magari spedendo
all'applicazione Paint i vari "tasti" corrispondenti alle necessarie azioni)
il file BMP a Paint, "dirgli" di salvarlo in GIF e uscire.
Pensate che sia possibile e lecito? Grazie a tutti.

per lungo che possa essere.
Scusate per il post un po' lunghetto:
Ecco tutto il codice per convertire da bmp a gif...
Private Sub mnuconvertBMPtoGIF_Click()
   Dim tmpimage As imgdes
   Dim tmp2image As imgdes
   Dim rcode As Long
   Dim vbitcount As Long
   Dim colors As Long
   Dim bdat As BITMAPINFOHEADER ' Reserve space for BMP struct
   Dim bmp_fname As String
   Dim gif_fname As String
   Const CR_TSDDIFF = 3
   bmp_fname = "test.bmp"
   gif_fname = "test.gif"
   ' Get info on the file we're to load
   rcode = bmpinfo(bmp_fname, bdat)
   If (rcode <> NO_ERROR) Then
      MsgBox "Cannot find file", 0, "Error encountered!"
      Exit Sub
   End If
   vbitcount = bdat.biBitCount
   If (vbitcount >= 16) Then  ' 16-, 24-, or 32-bit image is loaded into
24-bit buffer
      vbitcount = 24
   End If
   ' Allocate space for an image
   rcode = allocimage(tmpimage, bdat.biWidth, bdat.biHeight, vbitcount)
   If (rcode <> NO_ERROR) Then
     MsgBox "Not enough memory", 0, "Error encountered!"
     Exit Sub
   End If
   ' Load image
   rcode = loadbmp(bmp_fname, tmpimage)
   If (rcode <> NO_ERROR) Then
      freeimage tmpimage ' Free image on error
      MsgBox "Cannot load file", 0, "Error encountered!"
      Exit Sub
   End If
   If (vbitcount = 24) Then ' If we loaded a 24-bit image, convert to 8-bit
palette color
       ' because gif only supports up to 8-bit pixel depth
     rcode = allocimage(tmp2image, bdat.biWidth, bdat.biHeight, 8)
     If (rcode = NO_ERROR) Then
         colors = 256
         reduction_mode = CR_TSDDIFF   ' For the best image quality
         rcode = convertrgbtopalex(colors, tmpimage, tmp2image,
reduction_mode)
         freeimage tmpimage  ' Replace 24-bit image with 8-bit version of
image
         copyimgdes tmp2image, tmpimage
     End If
   End If
   ' Save image
   rcode = savegifex(gif_fname, tmpimage, 8, 0)
   freeimage tmpimage
End Sub
........... Add these defines and declarations to your Global module
...........
' 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
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 convertrgbtopalex Lib "VIC32.DLL" (ByVal palcolors As Long,
srcimg As imgdes, desimg As imgdes, ByVal mode As Long) As Long
Declare Sub copyimgdes Lib "VIC32.DLL" (srcimg As imgdes, desimg As imgdes)
Declare Function savegif Lib "VIC32.DLL" (ByVal Fname As String, srcimg As
imgdes) As Long
Declare Function savegifex Lib "VIC32.DLL" (ByVal Fname As String, srcimg As
imgdes, ByVal savemode As Long, ByVal transcolor As Long) As Long
Ciao, :o))
Antonio
-- "I grandi spiriti hanno sempre incontrato violenta opposizione da parte
delle menti mediocri."  A.Einstein

BITMAPINFOHEADER) As Long
Ho letto male o la vic32.dll costa 499 dollari?
Comunque, Lupo, per lavorare con jpeg, c'e' una dll free da Intel, con tanto
di codice di esempio ;-)
Vai su 
www.intel.com
, clicca su Developer, poi segui software -->
performance libraries.
-- 
ciao, hal
p.s.: gif non e' free, ma jpeg si' ;-)

Sorry... come "hal solito hal ragione" hal.


 codice sorgente, per lungo che possa essere.
PNG è libero... attendo smentite! ;)

> PNG è libero... attendo smentite! ;)
(da un ebook gratuito di php)
esperimenti con i vari formati di compressione
delle immagini - una piccola esperienza
----------------------------------------------
Una bella immagine della terra vista a tutto
tondo dallo spazio occupava nel vecchio
formato PCX compresso di Zsoft Paintbrush
con una variante dell'RLE circa 546K e
900K in memoria. Essa aveva 8038 colori
e dimensione 640x480.
Dopo averla compressa come GIF con un numero
di colori pari a soli 256, occupava ancora 187K
e la qualità era visibilmente diminuita
(in alcune zone il brutto effetto della
punteggiatura o dithering era molto evidente).
Compressa come PNG senza perdita di qualità
(ancora 8038 colori) si è ridotta a circa 411KB.
Compressa come PNG con 256 colori (al pari della GIF,
con lo stesso metodo di riduzione dei colori)
occupava 135KB.
Infine compressa come JPG con livello di compressione
15 (nell'intervallo di valori 1-99) occupava solo
83,4KB senza grande perdita della qualità.
Il formato migliore per una immagine di questo genere
è sicuramente il JPG. Tuttavia notate come PNG vada
un poco meglio di GIF anche in questo caso in cui un
PNG sarebbe poco indicato per il web, a parità di resa.
Ho preso poi una immagine abbastanza regolare e semplice
e più piccola, rappresentante dei geroglifici. In formato
Windows Bitmap l'immagine occupava 8,11KB e aveva solo
4 colori e dimensione 128x128 pixel.
Compressa come JPEG con fattore 15 occupava solo 6,34KB
(quindi di meno in questo caso), tuttavia la qualità
risulta più scadente, poichè JPEG non è adatto per
questo tipo di immagini.
Compressa come GIF senza alcuna perdita di qualità
(aveva ancora 4 colori diversi), occupa solo 1,70KB.
Compressa come PNG pure senza perdita di qualità
occupava 1,58KB.
In questo caso di immagine piccola il guadagno del PNG
è percentualmente non molto alto, inferiore all'1,2%,
tuttavia in altri casi l'algoritmo di compressione di
PNG può fare di meglio, senza tenere conto che con PNG
potete avere anche un maggior numero di colori.
Inoltre nessuno può farvi passare guai perchè state usando
programmi free che non hanno pagato $5000 alla Unisys.

 ha scritto

ieri ho reinstallato un 95 (ultima cosa decente prima del 2000, imho) e
paint e' fra gli accessori che mette come opzionali. potrei sbagliarmi, ma
di default la casella non e' spuntata. quindi #1 potresti non trovarlo a
bordo, #2 non e' bellissimo fare uno shell a un altro programma. io gia' non
mi compatisco quando faccio shellexecute sui txt e html. piuttosto che
chiamare paint vado a pulire le scuderie dell'accademia. e' un lavoro meno
sporco :)
gif e' copyr unisys. (e' semplicemente pietoso che si siano messi a spillare
soldi _dopo_ che compuserve gli ha spianato lo standard de facto. gueenoes
of tacco). a meno che non abbiano cambiato politica recentemente, per quanto
ho capito, se dalla tua app salvi in gif _devi_ sganciargli una vagonata di
dollari. molti davvero. specie se la tua e' un'app commerciale, dubito che
te la cavi con i 500 della libreria che dice antonio. molti di piu'. ho gia'
riportato un paio di volte uno scambio di un programmatore vb con una
commerciale di unisys, che risultava simpatica come una limonata alla
candeggina.
png e jpeg sono liberi, tipo opensource, e se ne incentiva l'uso.
www.libpng.org
, se ricordo. c'era un elenco delle pèrincipali app che usano
il png. coi motori trovi facilmente anche l'hp di jpeg, forse 
www.jpeg.org
.
sul sito c'e' anche un riferimento a jpeg2000. non usare teleport perche' ci
sono miliardi di binari per n*x :)
in tutti e due i casi dovrebbero essere disponibili librerie e codice free.
per il jpeg c'e' la lib intel, che mi semba abbia usato gbc nel suo
imgutils, con esempi. ha postato lui il link:
http://www.gbcweb.com/files/files/imageutils.zip
intel ha appena messo fuori un altro bloccone di librerie, ipp20win.exe,
credo free per un po', 90 mb. cerca sul loro sito. ah, trovato:
http://intel.m0.net/m/s.asp?HB6152760804X1356227X107965X
abbastanza di recente direi che qualcuno abbia postato qui l'url di un'altra
libreria, mi sembra free. bon, trovato anche lui (potenza delle query:) :
http://www.imagemagick.org/
quanto al formato, png nasce proprio con lo scopo di aggirare gif, quindi va
benone per le immagini a pochi colori (una schermata la comprime anche piu'
del gif) mentre e' un disastro per le milioni di colori, per le quali c'e'
jpeg. a sua volta, proprio per gli algoritmi ad aree che usa, jpeg massacra
le immagini con molti tratti. prova con un programma qualunque a salvare una
foto in gif e una scritta in jpeg molto compresso e capirai quello che sto
dicendo.
buon ravanamento :)
--
ciao, j.
www.sundaysw.com
ah si', ieri provavo un notevole viewer free -- 
http://www.slowview.at/
 --
badabe'n badabe'n badabe'n:
    Convert animated GIF into MNG files
    and static GIF into PNG files on the fly
    (including transparency support)!.
gli animati erano l'ultima cosa per cui ricorrevo ai gif. mi sa che mo' mi
metto a ravanare anch'io su questo bienvenido mng, sperando che abbia
supporto dai browser...

miii... il mio link per intero...
ho scritto anche una dll per i png...
ma non l'ho ancora resa bubblica berché devo finire i test
-> GbC
http://www.gbcweb.com
F53C7B7263B8B09CCFE6AEBEFD97168F58B0C450

 ma non l'ho ancora resa bubblica berché devo finire i test
quanto boi la renti bubblica sarai il solido penefaddore :)
lemme know please
--
ciao, j.
www.sundaysw.com

 png e jpeg sono liberi, tipo opensource, e se ne incentiva l'uso.
Stamattina ho scaricato (su indicazione di Hal in questo topic) la ijl15.dll
da Intel per JPEG. Ho letto la licenza e posso anche distribuirla con gli
applicativi, ma non l'ho ancora provata.
Grazie per le altre (troppe!) info.

 applicativi, ma non l'ho ancora provata.
Occhio: i jpeg sono datalossy: se fai 3/4 salvataggi consecutivi della
stessa immagine jpeg alla fine rischi di avere una vomitata al posto della
fotografia iniziale.
Ciao

 fotografia iniziale.
Grazie dell'info, Zanna, ma per lo specifico uso che intenderei farne,
sarebbero tutti BMP creati dal codice (da un'anteprima di stampa di
documenti, ordini/fatture, composta con Picture.Print) e tutti "originali"
(nel senso che se il file esiste già lo cancello prima), quindi l'eventuale
trasformazione da BMP a JPG sarebbe una sola per ogni file prodotto.
Ciao (e... beh, mi vergogno un po', ma io da un sacco dovrei chiederti
scusa... lo faccio adesso, e pardon per il ritardo)

 per ogni file prodotto.
Se sono documenti il formato jpeg non è certo il più adatto,
dovresti utilizzare il png (che è libero).
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 scusa... lo faccio adesso, e pardon per il ritardo)
E per che cosa?
Ciao

 E per che cosa?
Ti avevo "minacciato" un plonk (mai praticato) quando, un mesetto fa, ...
"davi fuori di matto". ;-)))

 "davi fuori di matto". ;-)))
Ma quello non ero io... :P
Ciao