bernie (Normal User)
Pro
Messaggi: 164
Iscritto: 23/10/2019
|
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
Codice sorgente - presumibilmente VB.NET |
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 il 02/12/2023 alle 12:36 |
|
Carlo (Member)
Guru
Messaggi: 1349
Iscritto: 29/01/2018
|
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:
Codice sorgente - presumibilmente VB.NET |
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 |
|
bernie (Normal User)
Pro
Messaggi: 164
Iscritto: 23/10/2019
|
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
|
|
Carlo (Member)
Guru
Messaggi: 1349
Iscritto: 29/01/2018
|
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 il 02/12/2023 alle 15:44
in programmazione tutto è permesso |
|
bernie (Normal User)
Pro
Messaggi: 164
Iscritto: 23/10/2019
|
Ho provato le modifiche suggerite da Carlo ma il problema sussiste. Quindi opto per la soluzione fuori libreria che funziona.
|
|
bernie (Normal User)
Pro
Messaggi: 164
Iscritto: 23/10/2019
|
Si, è un FieldValue(). Ho messo all'inizio del programma Opion Strict On, questa volta ho avuto fortuna, solo la variabile "valore"mi dava errore.
|
|
Carlo (Member)
Guru
Messaggi: 1349
Iscritto: 29/01/2018
|
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 il 02/12/2023 alle 21:41
in programmazione tutto è permesso |
|
bernie (Normal User)
Pro
Messaggi: 164
Iscritto: 23/10/2019
|
Buongiorno
Ho provato come suggerito da Carlo , ma non sono riuscito a farlo funzionare , quindi ho modificato come di seguito
Codice sorgente - presumibilmente VB.NET |
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
|
|