[gelöst][DX9] Create Texture from URL

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
D3DX
Beiträge: 33
Registriert: 17.10.2010, 14:06
Echter Name: Marco
Wohnort: 58119 Hagen (NRW)

[gelöst][DX9] Create Texture from URL

Beitrag von D3DX »

Hallo,
leider gibt es in Directx(9) die Funktion "D3DXCreateTextureFromURL" nicht.

Ich möchte in meinem Prog eine Textur aus einer nicht lokal gespeicherten Grafikdatei erzeugen.
Gibt es hierfür bereits eine lizensfreie lib, die dieses unterstützt.
Google spuckt zwar einige 'media' libs raus, aber unter features kann man nicht direkt erkennen, ob das Lesen einer url unterstützt wird.

Deshalb meine Frage, ob ihr eine Idee habt, womit ich das o.g. Vorhaben realisieren könnte.


Marco
Zuletzt geändert von D3DX am 19.08.2011, 18:50, insgesamt 1-mal geändert.
EyDu
Establishment
Beiträge: 102
Registriert: 24.08.2002, 18:52
Wohnort: Berlin
Kontaktdaten:

Re: [DX9] Create Texture from URL

Beitrag von EyDu »

Hallo.

Da du eh unter Windows arbeitest, würde ich einfach den Umweg über `URLDownloadToFile` gehen. Da ich mich mit der ganzen Windows API ehrlich gesagt überhaupt nicht auskenne, würde ich an der entsprechenden Stelle in der Dokumentation noch nach Varianten Suchen. Sicher gibt es auch irgend etwas zum laden in den Speicher und zum sychronen/asynchronen Aufruf der Funktion.

Sebastian
D3DX
Beiträge: 33
Registriert: 17.10.2010, 14:06
Echter Name: Marco
Wohnort: 58119 Hagen (NRW)

Re: [DX9] Create Texture from URL

Beitrag von D3DX »

Habe noch weiter nach einer Lösung gesucht und denke, daß ich den libCurl-Weg gehen werde,
um das Image lokal auf die Platte zu speichern.
Dann weiter mit der bekannten Funktion D3DXCreateTextureFromFile.

Hier noch mein Fund aus dem web:

Init

Code: Alles auswählen

#pragma comment (lib, "libcurl.lib")
#include <curl/curl.h>

// callback function writes data to a std::ostream
static size_t data_write(void* buf, size_t size, size_t nmemb, void* userp)
{
	if(userp)
	{
		std::ostream& os = *static_cast<std::ostream*>(userp);
		std::streamsize len = size * nmemb;
		if(os.write(static_cast<char*>(buf), len))
			return len;
	}

	return 0;
}
		
// timeout is in seconds
CURLcode curl_read(const std::string& url, std::ostream& os, long timeout = 30)
{
	CURLcode code(CURLE_FAILED_INIT);
	CURL* curl = curl_easy_init();

	if(curl)
	{
		if(CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &data_write))
		&& CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L))
		&& CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L))
		&& CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_FILE, &os))
		&& CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout))
		&& CURLE_OK == (code = curl_easy_setopt(curl, CURLOPT_URL, url.c_str())))
		{
			code = curl_easy_perform(curl);
		}
		curl_easy_cleanup(curl);
	}
	return code;
}

// Image URL
std::string urlImage = "http://knowingallah.com/media/Images/asrar_alkwn/clip_image014.jpg";
Start Download

Code: Alles auswählen

curl_global_init(CURL_GLOBAL_ALL);
std::ofstream ofs("output.jpg", std::ostream::binary);
if(CURLE_OK == curl_read(urlImage, ofs))
{
	// Image successfully written to file
        // Create Texture from file now
}
curl_global_cleanup();

Danke schön
Marco
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [gelöst][DX9] Create Texture from URL

Beitrag von dot »

libcurl mag eine Lösung sein. Aber da du dich sowieso schon auf Windows beschränkst, kannst du doch auch gleich die entsprechende Funktionalität der WinAPI benutzen und dir so die Abhängigkeit von libcurl sparen...
Antworten