Oppure

Loading
02/12 11:24
bernie
Salve a tutti
Devo creare un Tiff partendo delle dimensioni di un altro Tiff.
Riesco a creare il Tiff usando una libreria , però non riesco a prendere i tag del Tiff esistente e usarli per creare il secondo Tiff.
Allego quello che ho fatto fino ad ora

Imports BitMiracle.LibTiff.Classic
Public Class Form1
    Dim larghezza, altezza As Int32
    Dim risoluzione_x, risoluzione_y As Int32
    Dim valore As Int32


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        My.Computer.FileSystem.CreateDirectory("C:\Maschere")

        larghezza = 1000
        altezza = 1000
        risoluzione_x = 400
        risoluzione_y = 400

        Using tif As Tiff = Tiff.Open("C:\Maschere\test.tiff", "w")
            Using origine As Tiff = Tiff.Open("C:\Maschere\origine.tiff", "r")
                Dim largo As FieldValue()
                Dim alto As FieldValue()
                alto  = origine.GetField(TiffTag.IMAGELENGTH)                            'leggo la altezza del file originale 
                largo = origine.GetField(TiffTag.IMAGEWIDTH)                             'leggo la larghezza del file originale 
                
                tif.SetField(TiffTag.IMAGEWIDTH, larghezza)
                tif.SetField(TiffTag.IMAGELENGTH, altezza)
                tif.SetField(TiffTag.BITSPERSAMPLE, 2)
                tif.SetField(TiffTag.SAMPLESPERPIXEL, 1)
                tif.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISWHITE)
                tif.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG)
                tif.SetField(TiffTag.ROWSPERSTRIP, tif.DefaultStripSize(1))
                tif.SetField(TiffTag.XRESOLUTION, risoluzione_x)
                tif.SetField(TiffTag.YRESOLUTION, risoluzione_y)
                tif.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH)
                tif.SetField(TiffTag.STRIPOFFSETS, 0)
                tif.SetField(TiffTag.STRIPBYTECOUNTS, 1)


                Dim buf_originale As Byte() = New Byte(larghezza - 1) {}            'dichiaro  il buffer dal file originale 
                Dim buf As Byte() = New Byte(larghezza - 1) {}                      'dichiaro il buffer del nuovo file
                For i As Integer = 0 To altezza - 1                                 'scansiono l'altezza 
                    For j As Integer = 0 To larghezza - 1                           'scansiono la larghezza  
                        origine.ReadScanline(buf_originale, i)                      'leggo la riga "i" dal file originale 
                        valore = Buffer.GetByte(buf_originale, j)                   'leggo il singolo valore del byte della riga "i" originale
                        
                        Buffer.SetByte(buf, j, valore)                             'scrivo il valore nel nuovo buffer 
                    Next
                    tif.WriteScanline(buf, i)                                       'scrivo il buffer nel nuovo file 
                Next
            End Using
        End Using
        MsgBox("Maschera Creata in C:\Maschere")
    End Sub
End Class


La mia idea era di usare le variabili largo e alto per settare le variabili larghezza e altezza.
Mi da sempre errore BC30311 non è possibile convertire il valore di tipo FieldValue() in Integer
Qualche consiglio ?
Grazie
Ultima modifica effettuata da bernie 02/12 11:36
aaa
02/12 13:47
Carlo
Non conoscendo la libreria non ti so dare una risposta precisa.

Dove hai l'errore sulle dichiarazioni?:

Dim largo As FieldValue()
Dim alto As FieldValue()

oppure sulle assegnazioni?:

alto = origine.GetField(TiffTag.IMAGELENGTH) 'leggo la altezza del file originale
largo = origine.GetField(TiffTag.IMAGEWIDTH) 'leggo la larghezza del file originale


VB dovrebbe fare le conversioni di tipo in modo implicito, perché di default è settato su Option Strict Off, se la conversione non avviene, con il debug si può andare a vedere il tipo ed istruire il compilatore sulla conversione da fare.

Puoi provare a dichiarare la tua variabile largo come oggetto:

Dim largo As Object()
e metti il dato (sempre se è possibile, non conosco le istruzioni della libreria)
largo = origine.GetField(TiffTag.IMAGEWIDTH)

ora in largo hai un oggetto con un valore che puoi convertire in intero (solo se si può;)

Dim w As Integer = CType(largo, Integer) ' in w la larghezza

Fine prova.

Ti consiglio di mettere all'inizio del tuo programma: Option Strict On, vedrai quante volte hai delegato VB nella conversione dei tipi. Comodo ma ti ha reso sempre inconsapevole di una parte essenziale della programmazione, per esempio in C# il programmatore deve sempre convertire i tipi.
Con l'istruzione: Option Strict On rendi VB simile a C#, facendoti consapevole del tipo di dati che stai manipolando.

Uscendo dalla libreria per sapere la larghezza e l'altezza di un tif o qualsiasi immagine:

Dim bmp As Image = Bitmap.FromFile("C:\Maschere\origine.tiff")
Dim h As Integer = bmp.Height
Dim w As Integer = bmp.Width




in programmazione tutto è permesso
02/12 13:55
bernie
Ciao Carlo
L'errore l'ho quando provo a scrivere
altezza= alto.
Adesso provo a farlo fuori libreria.
Anche se la libreria mi permette di leggere anche altri tag che mi servono.
Ma questo forse lo posso aggirare.
Grazie
aaa
02/12 14:31
Carlo
altezza = CType(alto, Int32)

se hai ancora errore significa che in alto non c'è un valore convertibile in Int32, alto è un oggetto di tipo FieldValue() e magari devi screvere alto.IMAGELENGTH per l'altezza e alto.IMAGEWIDTH per la larghezza come si evince da altre parti del tuo codice, o simile, vedi cosa ti da l'intellisense.

Ultima modifica effettuata da Carlo 02/12 14:44
in programmazione tutto è permesso
02/12 15:10
bernie
Ho provato le modifiche suggerite da Carlo ma il problema sussiste.
Quindi opto per la soluzione fuori libreria che funziona.
aaa
02/12 15:49
bernie
Si, è un FieldValue().
Ho messo all'inizio del programma Opion Strict On, questa volta ho avuto fortuna, solo la variabile "valore"mi dava errore.
aaa
02/12 16:12
Carlo
Postato originariamente da bernie:

Si, è un FieldValue().
Ho messo all'inizio del programma Opion Strict On, questa volta ho avuto fortuna, solo la variabile "valore"mi dava errore.


con l'intellisense quando scrivi alto. alla scrittura del punto ti compare l'elenco delle proprietà usabili?
Guarda l'elenco e controlla se c'è un nome riconducible all'altezza.
L'altezza potrebbe essere una sottoproprietà, magari nell'elenco c'é: Dimension
Allora scrivi: alto.Dimension. alla scriitura del secondo punto compare un'altro elenco dove ci potrebbe essere Height, se così fosse l'intero usabile sarebbe sotto a: alto.Dimension.Height.

Ho fatto una ricerca e ho trovato che per sapere le dimensioni usando la libreria BitMiracle.LibTiff.Classic si fa così:

dopo aver indicato l'immagine con:
Dim origine As TiffImage = New TiffImage("C:\Maschere\origine.tiff";)

Dim w As Integer = origine.GetWidth()
Dim h As Integer = origine.GetHeight()

Non sono in grado di controllare se è vero.
Ultima modifica effettuata da Carlo 02/12 20:41
in programmazione tutto è permesso
03/12 8:42
bernie
Buongiorno
Ho provato come suggerito da Carlo , ma non sono riuscito a farlo funzionare , quindi ho modificato come di seguito
Using origine As Tiff = Tiff.Open("C:\Maschere\origine.tiff", "r")
                Dim larghezza_a() As FieldValue
                Dim altezza_a() As FieldValue
                larghezza_a = origine.GetField(TiffTag.IMAGEWIDTH)
                altezza_a = origine.GetField(TiffTag.IMAGELENGTH)
                Dim larghezza As Integer = larghezza_a(0).ToInt()
                Dim altezza As Integer = altezza_a(0).ToInt()

Dalle prove fatte fino ad ora funziona .
Grazie
aaa