Sicuro! Di seguito troverai il codice che ha svolto il lavoro. Costruiamo un piccolo esempio SQL, ma non sono nemmeno un esperto SQL, quindi fai attenzione
Questo codice è in grado di trasferire JPG con una dimensione massima di 256 kB. Se vuoi trasferire immagini più grandi, aumenta semplicemente il numero di colonne, ad esempio aggiungi ImgVarChar8, ImgVarChar9 ecc.
Forse puoi aiutarmi con la mia domanda successiva Qui ?
Saluti!
-------------- Inizio codice SQL --------------
CREA TABELLA tIMG(
ID INT Chiave primaria di identità,
Img VARBINARIO(MAX)
)
ANDARE
INSERT INTO tIMG(Img) SELECT BulkColumn FROM
OPENROWSET(BULK 'C:\Test\test.jpg', SINGLE_BLOB) AS InsertIMG
ANDARE
CREA VISTA vImg AS
SELECT convert(varchar(max),substring(Img,0,32000),2) ImgVarChar0
,convert(varchar(max),sottostringa(Img,32000,32000),2) ImgVarChar1
,convert(varchar(max),sottostringa(Img,64000,32000),2) ImgVarChar2
,convert(varchar(max),sottostringa(Img,96000,32000),2) ImgVarChar3
,convert(varchar(max),sottostringa(Img,128000,32000),2) ImgVarChar4
,convert(varchar(max),sottostringa(Img,160000,32000),2) ImgVarChar5
,convert(varchar(max),sottostringa(Img,192000,32000),2) ImgVarChar6
,convert(varchar(max),sottostringa(Img,224000,32000),2) ImgVarChar7
DA [dbo].[tIMG]
ANDARE
-------------- Fine codice SQL --------------
-------------- Inizio codice JMP --------------
// Query SQL per ottenere i dati esadecimali (stringhe) dal database.
// Le stringhe vengono memorizzate in diverse colonne nella tabella dati "JPG_Query".
Nuova query SQL(
Connessione(
"La tua connessione"
),
Nomeinterrogazione( "JPG_Query" ),
Seleziona(Colonna( "ImgVarChar0", "t1" ), Colonna( "ImgVarChar1", "t1" ) ,
Colonna( "ImgVarChar2", "t1" ),Colonna( "ImgVarChar3", "t1" ),
Colonna( "ImgVarChar4", "t1" ),Colonna( "ImgVarChar5", "t1" ),
Colonna( "ImgVarChar6", "t1" ) ,Colonna( "ImgVarChar7", "t1" ) ),
Da( Tabella( "vImg", Schema( "dbo" ), Alias( "t1" ) ) ),
) <
// Ripete per creare l'immagine JPG dalle stringhe esadecimali e mostrare l'immagine (forse c'è del codice ridondante...)
interruttore = 0;
conteggio_prova = 0;
max_tentativo = 200;
codice esadecimale = "";
While(switch == 0 & count_try < max_try,
conta_prova++;
Tentativo(
codice esadecimale1 = DataTable("JPG_Query"):Nome("ImgVarChar0")[1];
codice esadecimale2 = DataTable("JPG_Query"):Nome("ImgVarChar1")[1];
codiceesadecimale3 = DataTable("JPG_Query"):Nome("ImgVarChar2")[1];
hexcode4 = DataTable("JPG_Query"):Nome("ImgVarChar3")[1];
hexcode5 = DataTable("JPG_Query"):Nome("ImgVarChar4")[1];
hexcode6 = DataTable("JPG_Query"):Nome("ImgVarChar5")[1];
hexcode7 = DataTable("JPG_Query"):Nome("ImgVarChar6")[1];
hexcode8 = DataTable("JPG_Query"):Nome("ImgVarChar7")[1];
codice hex = codice hex1||codice hex2||codice hex3||codice hex4||codice hex5||codice hex6||codice hex7||codice hex8;
immagine = Apri (da esadecimale a BLOB (codice esadecimale), "jpg");
Se (Manca (codice esadecimale) == 0 & È scriptabile (Tabella dati ("JPG_Query")) == 1,
Nuova finestra ("Immagine JPG", immagine);
codice esadecimale = "";
interruttore = 1;
Chiudi(Tabella dati("JPG_Query"), Nessun salvataggio);
);
,
Aspetta(0,01);
Se (count_try == max_try,
Lancia("Errore!");
);
); // Chiudi Prova
); // Chiudi mentre
-------------- Fine codice JMP --------------
Non c'è motivo di dispiacersi. Sono stupito dalla rapidità con cui vengono fornite le risposte qui
E ancora, grazie mille! Finora siamo stati in grado di fare quanto segue:
1. Nel database, abbiamo convertito l'immagine da BLOB (varbinary(max)) a esadecimale utilizzando la funzione CONVERT e impostando lo stile su "2" - questo lascia fuori "0x" all'inizio della stringa.
2. Abbiamo trasferito la stringa esadecimale a jmp tramite una query in cui viene salvata in una tabella dati.
3. Abbiamo mostrato l'immagine con la funzione che hai menzionato: New Window("Foo", Open(HexToBlob(hex-string)), "jpg")
Ma ora ci imbattiamo effettivamente nel problema dei 64k. Dato che abbiamo capito che in pratica significa che possiamo memorizzare solo 64k in una singola cella in una tabella di dati, abbiamo avuto l'idea di dividere la stringa esadecimale nel database su più colonne e concatenarla di nuovo in jmp dopo aver importato il file parti in più colonne.
Riferirò presto questo aspetto.
Passa un bel weekend!
EDIT: funziona! Siamo stati in grado di trasferire il JPG suddividendo prima l'immagine binaria in parti, convertendo le parti nel database in esadecimale, trasferendo le parti esadecimali e infine concatenandole nuovamente in jmp. Davvero fantastico! Grazie.
Scusa se ci ho messo così tanto tempo.Ho fatto qualche ricerca su questo (grazie Bryan), penso che sarà limitato da un buffer di 64K in JMP 12 che gli impedirà di funzionare con immagini più grandi di 32K (dopo aver raddoppiato la loro dimensione in esadecimale hanno riscontrato il problema di 64K) .Non è molto, anche in un JPG.Bryan (conosce molto più SQL di me) dice "Se ho creato una colonna "Codificata" di VARCHAR(max) e ho codificato il varbinary utilizzando CONVERT, otterrò i dati della stringa HEX come previsto."Ecco un riferimento https://basitaalishan.com/2014/09/11/sql-server-converting-binary-data-to-a-hexadecimal-string/ Ho trovato; lascia fuori lo 0x (stile) sulla parte anteriore dell'esagono che invii a JMP.
Una volta che hai convertito i dati esadecimali e li hai inseriti in una tabella dati JMP, dovresti essere in grado di recuperare l'immagine in questo modo:
//hex = hex(loadtextfile("$desktop/hi.jpg",blob)); // ecco come ho ottenuto alcuni dati esadecimali
//scrivi(esadecimale);
esadecimale="";
immagine = open( hextoblob(hex), "jpg");
newwindow("decodificato", immagine);
un jpg4K.
Ciao Craig,
grazie per la tua risposta Sì, si tratta effettivamente di dati con codifica esadecimale. In realtà leggiamo un JPG con un software .NET in un database, dove viene salvato in un tipo di colonna varbinary(max). Quindi, come dici tu, immagino che sia possibile trasferire i dati con codifica esadecimale su jmp tramite una query SQL. A questo proposito abbiamo due domande:
1. Come si legge una colonna varbinary(max) in una colonna di caratteri in jmp tramite una query?
2. Cosa bisogna fare per trasformare i dati nella colonna dei caratteri in un'immagine?
So che queste domande potrebbero esagerare, ma ogni piccolo suggerimento è apprezzato.
Grazie!
EDIT: mi sono imbattuto questo filo , che affronta ciò che vogliamo fare. Riferendosi a questo, immagino sia necessario trasferire prima i dati BLOB in formato esadecimale nel database e poi trasferirli su JMP.
Penso che JMP lo faccia non supportare il trasferimento di dati binari da SQL.Ma, se riesci a trasferire i dati binari in JMP, magari come dati codificati esadecimali in una colonna di caratteri in una tabella di dati, allora possono essere riconvertiti in un'immagine.Dovrai sapere qual è il formato dei dati, JPG, PNG, RAW.Se RAW, dovrai sapere qual è il formato RAW e come lavorarci.
Quando ho letto la domanda per la prima volta, ho immaginato che l'array di byte contenesse dati RGB RAW, ma sembra più probabile che si tratti di PNG o JPG, il che sarebbe un problema più semplice rispetto alla decodifica dei dati RAW.