Sicher! Unten finden Sie den Code, der die Aufgabe erledigt hat. Wir bauen ein kleines SQL-Beispiel, aber ich bin auch kein SQL-Experte, also aufgepasst
Dieser Code ist in der Lage, JPGs mit einer maximalen Größe von 256 kB zu übertragen. Wenn Sie größere Bilder übertragen möchten, erhöhen Sie einfach die Anzahl der Spalten, also fügen Sie ImgVarChar8, ImgVarChar9 usw. hinzu.
Vielleicht können Sie mir bei meiner Folgefrage helfen Hier ?
Prost!
-------------- SQL-Code-Start --------------
TABELLE ERSTELLEN tIMG(
ID INT Identitäts-Primärschlüssel,
Img VARBINARY(MAX)
)
GEHEN
EINFÜGEN IN tIMG(Img) SELECT BulkColumn FROM
OPENROWSET(BULK 'C:\Test\test.jpg', SINGLE_BLOB) AS InsertIMG
GEHEN
ANSICHT vImg AS ERSTELLEN
SELECT konvertieren(varchar(max),substring(Img,0,32000),2) ImgVarChar0
,convert(varchar(max),substring(Img,32000,32000),2) ImgVarChar1
,convert(varchar(max),substring(Img,64000,32000),2) ImgVarChar2
,convert(varchar(max),substring(Img,96000,32000),2) ImgVarChar3
,convert(varchar(max),substring(Img,128000,32000),2) ImgVarChar4
,convert(varchar(max),substring(Img,160000,32000),2) ImgVarChar5
,convert(varchar(max),substring(Img,192000,32000),2) ImgVarChar6
,convert(varchar(max),substring(Img,224000,32000),2) ImgVarChar7
VON [dbo].[tIMG]
GEHEN
-------------- Ende des SQL-Codes --------------
-------------- JMP-Code-Start --------------
// SQL-Abfrage zum Abrufen der Hex-Daten (Strings) aus der Datenbank.
// Die Strings werden in verschiedenen Spalten in der Datentabelle „JPG_Query“ gespeichert.
Neue SQL-Abfrage(
Verbindung(
„Ihre Verbindung“
),
QueryName( "JPG_Query" ),
Select( Column( "ImgVarChar0", "t1" ), Column( "ImgVarChar1", "t1" ) ,
Column( "ImgVarChar2", "t1" ),Column( "ImgVarChar3", "t1" ),
Column( "ImgVarChar4", "t1" ),Column( "ImgVarChar5", "t1" ),
Column( "ImgVarChar6", "t1" ) ,Column( "ImgVarChar7", "t1" ) ),
From( Table( "vImg", Schema( "dbo" ), Alias( "t1" ) ) ),
) << Ausführen;
// Schleife, um das JPG-Bild aus den Hex-Strings zu erstellen und das Bild anzuzeigen (vielleicht gibt es redundanten Code ...)
Schalter = 0;
count_try = 0;
max_try = 200;
Hexcode = "";
While(switch == 0 & count_try < max_try,
count_try++;
Versuchen(
hexcode1 = DataTable("JPG_Query"):Name("ImgVarChar0")[1];
hexcode2 = DataTable("JPG_Query"):Name("ImgVarChar1")[1];
hexcode3 = DataTable("JPG_Query"):Name("ImgVarChar2")[1];
hexcode4 = DataTable("JPG_Query"):Name("ImgVarChar3")[1];
hexcode5 = DataTable("JPG_Query"):Name("ImgVarChar4")[1];
hexcode6 = DataTable("JPG_Query"):Name("ImgVarChar5")[1];
hexcode7 = DataTable("JPG_Query"):Name("ImgVarChar6")[1];
hexcode8 = DataTable("JPG_Query"):Name("ImgVarChar7")[1];
Hexcode = Hexcode1||hexcode2||hexcode3||hexcode4||hexcode5||hexcode6||hexcode7||hexcode8;
picture = Open(Hex to Blob(hexcode), "jpg");
Wenn ( Missing(hexcode) == 0 & Is Scriptable( Data Table("JPG_Query") ) == 1 ,
Neues Fenster („JPG-Bild“, Bild);
Hexcode = "";
Schalter = 1;
Close(Data Table("JPG_Query") , NoSave);
);
,
Warten (0,01);
If (count_try == max_try ,
Throw("Fehler!");
);
); // Schließen Versuchen
); // Während schließen
-------------- Ende des JMP-Codes --------------
Kein Grund, sich zu bedauern. Ich bin erstaunt, wie schnell hier Antworten gegeben werden
Und nochmals vielen Dank! Bisher konnten wir Folgendes tun:
1. In der Datenbank haben wir das Bild mit der CONVERT-Funktion von BLOB (varbinary(max)) in Hex konvertiert und den Stil auf „2“ gesetzt – dadurch wird das „0x“ am Anfang der Zeichenfolge weggelassen.
2. Wir haben den Hex-String per Abfrage an jmp übergeben und dort in einer Datentabelle gespeichert.
3. Wir haben das Bild mit der von Ihnen erwähnten Funktion angezeigt: New Window("Foo", Open(HexToBlob(hex-string)), "jpg")
Aber jetzt stoßen wir tatsächlich auf das 64k-Problem. Da wir herausgefunden haben, dass das im Grunde bedeutet, dass wir nur 64k in einer einzelnen Zelle in einer Datentabelle speichern können, kamen wir auf die Idee, den Hex-String in der Datenbank auf mehrere Spalten aufzuteilen und ihn nach dem Import wieder in jmp zu verketten Teile in mehreren Spalten.
Ich werde bald darüber berichten.
Ein schönes Wochenende wünsche ich ihnen!
EDIT: Es funktioniert! Wir konnten das JPG übertragen, indem wir zunächst das Binärbild in Teile aufteilten, die Teile in der Datenbank in Hex umwandelten, die Hex-Teile übertragen und sie schließlich wieder in jmp verketten. Echt super! Danke schön.
Tut mir leid, dass es so lange dauert.Ich habe diesbezüglich einige Nachforschungen angestellt (danke Bryan). Ich denke, dass es durch einen 64-KB-Puffer in JMP 12 begrenzt wird, der verhindert, dass es mit Bildern funktioniert, die größer als 32 KB sind (nachdem sie ihre Größe im Hexadezimalformat verdoppelt haben, tritt das 64-KB-Problem auf). .Das ist nicht viel, selbst in einem JPG.Bryan (kennt sich viel besser mit SQL aus als ich) sagt: „Wenn ich eine „Encoded“-Spalte von VARCHAR(max) erstellt und die Variable mithilfe von CONVERT darin codiert habe, erhalte ich die HEX-String-Daten wie erwartet.“Hier ist eine Referenz https://basitaalishan.com/2014/09/11/sql-server-converting-binary-data-to-a-hexadecimal-string/ Ich fand; Lassen Sie das 0x (Stil) auf der Vorderseite des Hexadezimals weg, das Sie an JMP senden.
Sobald Sie die Hex-Daten von der Konvertierung erhalten und sie in eine JMP-Datentabelle übertragen haben, sollten Sie in der Lage sein, das Bild wie folgt zurückzubekommen:
//hex = hex(loadtextfile("$desktop/hi.jpg",blob)); // So habe ich einige Hex-Daten erhalten
//write(hex);
hex="";
picture = open( hextoblob(hex), "jpg");
newwindow( "dekodiert", Bild );
ein 4K-JPG.
Hallo Craig,
Danke für deine Antwort. Ja, es handelt sich tatsächlich um hexadezimal kodierte Daten. Wir lesen tatsächlich ein JPG mit einer .NET-Software in eine Datenbank ein, wo es in einer Spalte vom Typ varbinary(max) gespeichert wird. Wie Sie sagen, denke ich, dass es möglich ist, die hexadezimal codierten Daten über eine SQL-Abfrage an jmp zu übertragen. Hierzu haben wir zwei Fragen:
1. Wie liest man eine varbinary(max)-Spalte über eine Abfrage in eine Zeichenspalte in jmp ein?
2. Was muss getan werden, um die Daten in der Zeichenspalte wieder in ein Bild umzuwandeln?
Ich weiß, dass diese Fragen möglicherweise weit übertrieben sind, aber jeder kleine Hinweis ist willkommen.
Danke!
EDIT: Ich bin darüber gestolpert dieser Thread , das anspricht, was wir tun wollen. In diesem Zusammenhang denke ich, dass es notwendig ist, die BLOB-Daten zuerst in Hex in der Datenbank und dann in JMP zu übertragen.
Ich denke, JMP tut es nicht unterstützen die binäre Datenübertragung von SQL.Aber wenn Sie die Binärdaten an JMP übertragen können, vielleicht als hexadezimal kodierte Daten in einer Zeichenspalte in einer Datentabelle, dann können sie wieder in ein Bild umgewandelt werden.Sie müssen wissen, welches Format die Daten haben: JPG, PNG, RAW.Bei RAW müssen Sie wissen, was das Rohformat ist und wie Sie damit arbeiten.
Als ich die Frage zum ersten Mal las, stellte ich mir vor, dass das Byte-Array RAW-RGB-Daten enthielt, aber wahrscheinlicher wäre es ein PNG- oder JPG-Format, was ein einfacheres Problem wäre als das Dekodieren der RAW-Daten.