Newsgroup: it.comp.lang.visual-basic
Titolo: [.NET] Ridimensionare immagini

Ho un nuovo problema. Dovrei ridimensionare una gran quantità di immagini.
Ponendo che con una Dir ottengo la lista delle immagini (ma Dir va bene in
.NET o esiste un equivalente?).
Poi cerco di modificarla con questo codice (per ora la foto è fissa)
Dim OldImage As New Bitmap(Application.StartupPath & "\" & "Nico.jpg")
Dim NewImage As New Bitmap(120, 160)
NewImage = OldImage.GetThumbnailImage(120, 160, null, IntPtr.Zero)
NewImage.Save("Nico2.jpg")
Innanzitutto ho problemi con il "null" sulla terza riga, e poi mi da anche
problemi la prima riga (mi dice ""Parametro non valido")
Queste informazioni le ho reperite su questo 3d:
http://www.google.it/groups?hl=it&lr=&ie=UTF-8&threadm=c854n0%242lf%241%40carabinieri.cs.interbusiness.it&rnum=7&prev=/groups%3Fq%3Dridimensionare%2Bimmagini%2Bgroup:it.comp.lang.visual-basic%26hl%3Dit%26lr%3D%26ie%3DUTF-8%26selm%3Dc854n0%25242lf%25241%2540carabinieri.cs.interbusiness.it%26rnum%3D7
Dove sbaglio?
bye
-- 
Esistono 10 tipi di persone: chi conosce il binario e chi no.
Gestione Ottica - Gestionale per Ottici e Programmi Gratuiti su:
http://www.nicolaottomano.it

 problemi la prima riga (mi dice ""Parametro non valido")
null in VB è Nothing.
Il null inteso come Null di VB6 non esiste più.
Ora esiste solo Nothing e System.DBNull, che come dice il nome viene usato
per identificare il null di campi di DB.
Per la prima riga sei sicuro che il file esista?
Ad es. non so se StartupPath restituisca o no il "\".
P.S.: non serve che instanzi una nuova bitmap perchè GetThumbnailImage
restituisce già un nuovo oggetto.
Tra l'altre restituisce un'Image e non una Bitmap, e dato che Bitmap sta un
livello sotto (eredita da Image) credo proprio che ti dia un
InvalidCastException (o forse no, se restituisce un'image contenente una
bitmap, ma dovresti fare il DirectCast)
Ti conviene abilitare l'option explicit e l'option strict
Ciao
--
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Ti conviene abilitare l'option explicit e l'option strict
Già fatto.


 Non vorrei che l'errore avvenga perchè carico jpg e non bmp...
prova a cambiare la
Dim NewImage As New Bitmap(120, 160
in Dim NewImage as System.Drawing.image , le dimensioni tanto se le prende
direttamente dalla thumb !
-- 
<Gigio2K>
--- 
http://www.g2kweb.it/gigio2k
 ---
Nokia -> I.T.H.N. -> 
http://www.ithn.it/
VB -> I.C.L.VB -> 
http://www.it-lang-vb.net/

 prende direttamente dalla thumb !
Gigio tu mettevi il null sulla GetThumb, ma a me da errore. Che dovrei
mettere?


 mettere?
Nothing.
Null equivale a Nothing per C#
P.S.: se non ti liberi di MS.VB come pensi di imparare i nuovi costrutti? ;)


Ho ricevuto la tua email. Ho tradotto da C# a 
VB.NET
, ho digerito il codice
ed il risultato ottenuto (e funzionante) č:
Dim NewImage, Oldimage As System.Drawing.Image
Oldimage = System.Drawing.Image.FromFile(Application.StartupPath & "\" &
"Nico.jpg")
NewImage = Oldimage.GetThumbnailImage(120, 160, Nothing, IntPtr.Zero)
NewImage.Save("Nico2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
Grazie a tutti per l'aiuto.


 Grazie a tutti per l'aiuto.
prego ! Cmq anche io adesso sto per fare il grande passo di eliminare
l'assembli del VB6... oddio, sto per dare un taglio netto col passato ...
per adesso sono riuscito a fare un paio di  applicazioni di lavoro semplici
e la parte sul VB6 mi e' stato molto di aiuto nel passaggio a net, Nic, ora
basta, dai Stacchiamo col passato !


 passaggio a net, Nic, ora basta, dai Stacchiamo col passato !
Ricordo una bella frase letta tempo fa "il futuro ha un passato..."


 Ricordo una bella frase letta tempo fa "il futuro ha un passato..."
e vabe' ma se ti ci metti pure tu, resto qui per altri venti anni a usare
msgbox e left..... grrrrrr


Adesso voglio migliorare la qualitą delle immagini ottenute.
Allora invece di salvare con:
Overloads Public Sub Save(String, ImageFormat)
salvo con
Overloads Public Sub Save(Stream, ImageCodecInfo, EncoderParameters)
Perņ sull'MSDN non esistono esempi o valori da passare come
EncoderParameters :-(
Come guida devo dire che č un pņ scarsina...
Inoltre google oggi non č mio amico...


 EncoderParameters :-(
Dando cosě un'occhiata alla guida sembra che EncoderParameters č una
collezione di EncoderParameter che a sua volta contiene un Encoder e altra
roba.
Sinceramente non ho idea a cosa possa servire questa roba.


 Sinceramente non ho idea a cosa possa servire questa roba.
Sai dove si possono trovare degli esempi di codice .NET?
Il problema è che in .NET le cose non corrispondono allo spazio dei nomi
dichiarato.
Ad esempio il parametro ImageCodecInfo fa parte di
System.Drawing.Imaging.ImageCodecInfo
mentre bisogna passargli il parametro
System.Drawing.Imaging.ImageFormat.Bmp
Il problema è far corrispondere ciò che dice la guida con quello che dovrei
inserire come parametro...
bah!


usando Reflector ho visto come funziona una dll di ridimensionamento
immagini trovata su internet.
Allora ho capito che è possibile anche creare un tumbnail con
Dim Oldimage As System.Drawing.Image
Dim NewImage As Bitmap
Oldimage = System.Drawing.Image.FromFile(Application.StartupPath & "\" &
"Nico.jpg")
NewImage = New Bitmap(Oldimage, 150, 112)
NewImage.Save("Nico2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
La qualità delle immagini è molto superiore a quella ottenibile con la
GetThumbnailImage


 System.Drawing.Imaging.ImageFormat.Bmp
Immagino che System.Drawing.Imaging.ImageFormat.Bmp sia di tipo
System.Drawing.Imaging.ImageCodecInfo.
Il namespace si ferma a System.Drawing.Imaging, quindi nessuna incoerenza.
A volte le classi usano dei campi di classe come un enumeratore perchè
evidentemente sono gestite in qualche strano modo internamente.


 incoerenza.
Perň una documentazione piů dettagliata da parte di M$ non guasterebbe.


 GetThumbnailImage
percaso sei riuscito anche a gestire la compressione Jpg ?


 percaso sei riuscito anche a gestire la compressione Jpg ?
Ancora no, sto cercando in giro ma la documentazione disponibile su MSDN
online è scarsa e confusionaria. Sto anche cercando esempi in C# da poter
eventualmente convertire i 
VB.NET



Grazie per il suggerimento.
Ho trovato anche degli esempi, ma non riesco a tradurli. In particolare
l'istruzione
"using namespace Gdiplus;" dovrebbe equivalere alla "Imports" di VB? Se si,
perchè non trovo Gdiplus nei namespaces (e neanche nelle aggiunte...)?
Scusa ma è il mio primo programma in 
VB.NET
 e non mastico molto il C (sono
fermo al vecchio Borland C++ per Dos...)


 aggiunte...)?
il namespace Gdiplus di GDI+ equivale al System.Drawing di .NET. Le due 
implementazioni sono leggermente diverse (sono entrambe wrapper di 
gdiplus.dll, che espone un'API tradizionale, ma GDI+ usa classi C++ 
inline, .NET usa un'assembly scritta in C#), ma le classi dovrebbero 
essere grosso modo le stesse

 ha scritto nel messaggio
news:Xns9507E2F93...@193.70.192.192

Ho fatto XPOST su MPIDV e Corrado Cavalli mi ha fornito alcuni link (di cui
uno è uguale a uno dei tuoi).
Gironzolando ho trovato questo file
http://download.microsoft.com/download/5/c/c/5cc1e311-4711-4dbd-9529-28e3520fba0b/terrell0303.EXE
Che contiene vari files .cs
Ho tradotto in 
VB.NET
 il file BitmapUtils.cs ma mi sono bloccato in un
punto. Ti posto il codice:
*** BitmapUtils.cs***
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace Fractal_Viewer
{
 /// <summary>
 /// Summary description for BitmapUtils.
 /// </summary>
 public class BitmapUtils
 {
  public static void Save(Bitmap BM, Stream S, ImageFormat Format, int
Quality)
  // Save the Bitmap to the Stream.  If it's
  // in JPEG format, save with the specified
  // Quality level.
  {
   if (Format != ImageFormat.Jpeg)
   {
    // Save non-JPEG images withoug
    // adjusting the Quality level
    BM.Save(S, Format);
   }
   else
   {
    // Adjust quality level of JPEG images.
    // Create an EncoderParameters object
    // containing the Quality level as a
    // parameter.
    EncoderParameters Params = new EncoderParameters(1);
    Params.Param[0] = new EncoderParameter(Encoder.Quality, Quality);
    // Save the image using the JPEG encoder
    // with the specified Quality level.
    BM.Save(S, GetEncoderInfo("image/jpeg"), Params);
   }
  }
  private static ImageCodecInfo GetEncoderInfo(String MimeType)
  // Return an encoder of the specified Mime type
  // (e.g. "image/jpeg").
  {
   ImageCodecInfo Result = null;
   ImageCodecInfo[] Encoders = ImageCodecInfo.GetImageEncoders();
   for(int i = 0; Result == null && i < Encoders.Length; i++)
   {
    if (Encoders[i].MimeType == MimeType)
    {
     Result = Encoders[i];
    }
   }
   return Result;
  }
 }
}
***traduzione: BitmapUtils.vb***
Imports System
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Public Class BitmapUtils
    Public Shared Sub Save(ByVal BM As Bitmap, ByVal S As Stream, ByVal
Format As ImageFormat, ByVal Quality As Integer)
        ' Save the Bitmap to the Stream.  If it's
        ' in JPEG format, save with the specified
        ' Quality level.
        If Format Is ImageFormat.Jpeg Then
            ' Save non-JPEG images withoug
            ' adjusting the Quality level
            BM.Save(S, Format)
        Else
            ' Adjust quality level of JPEG images.
            ' Create an EncoderParameters object
            ' containing the Quality level as a
            ' parameter.
            Dim Params As New EncoderParameters(1)
            Params.Param(0) = New EncoderParameter(Encoder.Quality, Quality)
            ' Save the image using the JPEG encoder
            ' with the specified Quality level.
            BM.Save(S, GetEncoderInfo("image/jpeg"), Params)
        End If
    End Sub 'Save
    Private Shared Function GetEncoderInfo(ByVal MimeType As String) As
ImageCodecInfo
        ' Return an encoder of the specified Mime type
        ' (e.g. "image/jpeg").
        Dim Result As ImageCodecInfo = Nothing
        Dim Encoders As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders()
        Dim i As Integer
        For i = 0 To Encoders.Length
            If Encoders(i).MimeType = MimeType Then
                Result = Encoders(i)
            End If
        Next i
        Return Result
    End Function 'GetEncoderInfo
End Class 'BitmapUtils
Ma mi frega la riga " For i = 0 To Encoders.Length" che è sicuramente
errata. Come dovrei tradurla?


Posto il codice definitivo che sono riuscito a scrivere. Spero che non vi
siano errori.
Se si vogliono ridimensionare immagini usando la qualità standard del codec
Jpeg allora si usa:
Dim Oldimage As System.Drawing.Image
Dim NewImage As Bitmap
Oldimage = System.Drawing.Image.FromFile(Application.StartupPath & "\" &
"Nico.jpg")
NewImage = New Bitmap(Oldimage, 150, 112)
NewImage.Save("Nico2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
Se invece si vuole poter passare anche il valore della qualità allora ho
tradotto una classe C# e l'ho adattata alle mie esigenze ottenendo quindi:
Imports System
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Public Class BitmapUtils
    Public Shared Sub Save(ByVal BM As Bitmap, ByVal S As String, ByVal



    End Sub 'Save




        Return Result

Che può essere richiamata da:
BitmapUtils.Save(NewImage, "Nomefile.jpg", ImageFormat.Jpeg, 3)
Dove 3 è il valore di qualità (che a quanto sembra dalla documentazione può
variare da 0 a 99)
Spero che con questo post qualcuno dopo di me possa trovare le informazioni
già belle e pronte (io mi ci sono sbattuto 2 giorni...)


 informazioni già belle e pronte (io mi ci sono sbattuto 2 giorni...)
e io non posso fare altro che ringraziarti ! ^_-
Non e' che faccio lo scroccone fino in fondo... ma msdn per me sta
diventando sempre meno chiaro da seguire, a quanto un libro sull'uso di MSDN
?
Oramai uso google per cercare in msdn, uso google anche per trovare gli
esempi relativi... cavolo, se M$ , come stava cercando di fare, sarebbe
riuscita ad *assimilare* google almeno oggi avremmo un msdn un po + usabile
! :-/


 immagini.
io ....(non ci crederai)...mi son fatto una classe in NET....che uso su una
webform....
...che prende una img.....fa la thumb.....(come vuoi)....la salva in jpg (
alla qualità di compressione che vuoi)....popola un dataset con il contenuto
di una dir (jpg gif png)...se c'è una thumb non fa nulla (salvo non li dica
di riforzare a creare la thumb)...altrimenti ti fa la thumb.....tutto
condito da eventi....
....funziona bene (però lo dice uno che NET lo usa da poco e solo su webform
per il resto rimane al buon vecchio VB6).....chissà se interessa il
SC...casomai la dovrei ordinare e riempire di commenti ( Wodkino è moooolto
disordinato)...
ma il SC mi sa che di NET non accetta nulla vero?
:-)
---
Posta in uscita controllata con AVG Antivirus
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.703 / Virus Database: 459 - Release Date: 10/06/2004

> ma il SC mi sa che di NET non accetta nulla vero?
Il SC accetta .NET (credo che vi sia una sezione apposita).
Inviate tutto il materiale che avete che non appena ho le chiavi di accesso
lo pubblico.


 ma il SC mi sa che di NET non accetta nulla vero?
ma sai che io accetto tutto da te ^_- dai super alcolici ai vaffa :p
Siccome so pigro me la manderesti sta classe che me la studicchio per bene ?
Non ti preoccupare del disordine, ci vivo ! ^_^


         Next i
con:
Dim i As Int32 = 0
While (Result Is Nothing AndAlso i < Encoders.Length)
If Encoders(i).MimeType = MimeType Then
Result = Encoders(i)
End If
i += 1
End While
