Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 03:14

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



D3DXCreateTextureFromFileInMemoryEx

Discussion on D3DXCreateTextureFromFileInMemoryEx within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
D3DXCreateTextureFromFileInMemoryEx

Hallo,
ich möchte gerne diese Funktion hier nutzen um ein PNG in ein D3D zu laden. Habe mich auch schon etwas "angelesen". Ein Beispiel habe ich vor mir welches ich verstehe. Aber wie kriege ich das PNG als so nen Code ?
Terrat is offline  
Old 06/28/2014, 02:10   #2


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Sind doch nur die rohen Bytes, aus denen die Datei besteht in einem Array, oder irre ich mich da? Ist doch nicht zu schwer ein kleines Tool zu schreiben, was Byte für Byte (Binär) aus der gewünschten Datei ausliest und diese in einen String formatiert bspw. in eine Datei ausgibt.
Hab diesen C++-Code hier eben zusammengeklatscht. Es ist schon spät, daher verzeih bitte Flüchtigkeitsfehler oder fehlende Performanceoptimierungen (Bytes buffern).
Code:
#include <fstream>
#include <iomanip>
#include <string>

int main()
{
	const std::string file("C:\\Users\\Jeoni\\Desktop\\MyFile.png");

	std::ifstream in;
	std::ofstream out;
	int data = 0; // using zero initialized int here, so that LSByte is filled by in.read and everything gets well formated when written to out. this may be optimized
	unsigned int counter = 0;

	in.open(file, std::ifstream::in | std::ifstream::binary);
	out.open(file + "_code.txt", std::ofstream::out | std::ofstream::trunc);

	out << std::hex << std::setfill('0');
	out << "BYTE array[] = {";

	do
	{ // buffersize is 1 byte. increase it for optimization if you want to
		in.read(reinterpret_cast<char*>(&data), 1);
		if (counter++ % 16 == 0) out << std::endl << "\t";
		out << "0x" << std::setw(2) << data << ", ";
	} while (!in.eof());

	in.close();
	out.seekp(out.tellp() - std::streampos(2)); // overwrite the last comma and space
	out << std::endl << "};";
	out.close();

	std::cout << "Done." << std::endl;
	std::cin.get();
	return 0;
}
Selbst die Datei (samt Pfad) ist hardgecodet, aber es tut, was es soll, musst den Pfad selber ändern oder zur Laufzeit abfragen oder so
Outputdatei ist danach im gleichen Ordner, wie die Inputdatei, mit "_code.txt" am Dateinamen dran. Das ganze geht logischerweise mit sämtlichten Dateien, nicht nur PNGs.
MfG
Jeoni
Jeoni is offline  
Thanks
1 User
Old 06/29/2014, 13:08   #3
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Quote:
Originally Posted by Jeoni View Post
Sind doch nur die rohen Bytes, aus denen die Datei besteht in einem Array, oder irre ich mich da? Ist doch nicht zu schwer ein kleines Tool zu schreiben, was Byte für Byte (Binär) aus der gewünschten Datei ausliest und diese in einen String formatiert bspw. in eine Datei ausgibt.
Hab diesen C++-Code hier eben zusammengeklatscht. Es ist schon spät, daher verzeih bitte Flüchtigkeitsfehler oder fehlende Performanceoptimierungen (Bytes buffern).
Code:
#include <fstream>
#include <iomanip>
#include <string>

int main()
{
	const std::string file("C:\\Users\\Jeoni\\Desktop\\MyFile.png");

	std::ifstream in;
	std::ofstream out;
	int data = 0; // using zero initialized int here, so that LSByte is filled by in.read and everything gets well formated when written to out. this may be optimized
	unsigned int counter = 0;

	in.open(file, std::ifstream::in | std::ifstream::binary);
	out.open(file + "_code.txt", std::ofstream::out | std::ofstream::trunc);

	out << std::hex << std::setfill('0');
	out << "BYTE array[] = {";

	do
	{ // buffersize is 1 byte. increase it for optimization if you want to
		in.read(reinterpret_cast<char*>(&data), 1);
		if (counter++ % 16 == 0) out << std::endl << "\t";
		out << "0x" << std::setw(2) << data << ", ";
	} while (!in.eof());

	in.close();
	out.seekp(out.tellp() - std::streampos(2)); // overwrite the last comma and space
	out << std::endl << "};";
	out.close();

	std::cout << "Done." << std::endl;
	std::cin.get();
	return 0;
}
Selbst die Datei (samt Pfad) ist hardgecodet, aber es tut, was es soll, musst den Pfad selber ändern oder zur Laufzeit abfragen oder so
Outputdatei ist danach im gleichen Ordner, wie die Inputdatei, mit "_code.txt" am Dateinamen dran. Das ganze geht logischerweise mit sämtlichten Dateien, nicht nur PNGs.
MfG
Jeoni
Dankö hat geklapt war ja vollkomen auf dem falschen weg
Terrat is offline  
Old 06/29/2014, 14:49   #4


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Ich würde ja eher eine der XXXFromFile Textur Methoden nutzen, die Datei zur Laufzeit auslesen und mit dem ausgelesenen Inhalt die D3DXCreateTextureFromFileInMemory aufrufen oder, wenn es keine physische Datei sein darf, mit Ressourcen und den dafür vorgesehenen Funktionen arbeiten, als mir den Quellcode mit solchen Arrays vollzumüllen.
MrSm!th is offline  
Old 07/03/2014, 18:08   #5


 
Ende!'s Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 6,378
Received Thanks: 7,996
Quote:
Originally Posted by MrSm!th View Post
Ich würde ja eher eine der XXXFromFile Textur Methoden nutzen, die Datei zur Laufzeit auslesen und mit dem ausgelesenen Inhalt die D3DXCreateTextureFromFileInMemory aufrufen oder, wenn es keine physische Datei sein darf, mit Ressourcen und den dafür vorgesehenen Funktionen arbeiten, als mir den Quellcode mit solchen Arrays vollzumüllen.
Ich mach's auch meistens so, hat durchaus seine Vorteile. Zum Beispiel wenn man auf Manual-Mapping setzt, gestaltet sich das mit Resources nicht so einfach (die Resource-Routines erfordern einen Eintrag in der Module-List im PEB). Hab dazu noch folgendes Makro, um die "Resources" (die Byte-Arrays) in 'ne extra PE-Section zu moven:
Code:
#ifdef _MSC_EXTENSIONS
#  pragma   section(".nrsrc", read)
#  define   NAREA_RSRC __declspec(allocate(".nrsrc"))
#else
#  define   NAREA_RSRC
#endif
Nutzt man dann einfach so:
Code:
NAREA_RSRC static const uint8_t myFancyResource[] = 
{
   0x00, 0x11, 0x22, 0x33, 0x44, 0x55, /* ... */
};
Klappt nur bei MSVC, wird ansonsten einfach ignoriert.
Ende! is offline  
Old 07/04/2014, 13:08   #6


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Dass man es beim hacken anders macht als in einem legit Projekt, wo man auf guten Code Wert legt, ist nichts neues.
War nur ein allgemeiner Vorschlag zur Lösung des Problems in den allermeisten Fällen. Ich bezweifle, dass der TE sich mit Edge Cases wie Manual Mapping vor Reverse Engineering oder Anti Cheats schützen muss.
MrSm!th is offline  
Reply




All times are GMT +1. The time now is 03:14.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.