官方檔案中介紹這個不多。。。。因為公司現有這樣的要求 , 有一批自定義格式的圖片要在游戲中繪制 , 這批圖片給到我手上的時候是一個結構本, 有大小,型別這些不詳細說了 。 里面有一個指標指向RGBA的資料流, 讓我把這個流加載到direct的紋理資源里面。
而我以前一直是用D3DX10CreateShaderResourceViewFromFile的 所以不知道怎么弄。。。 后來看檔案發現有D3DX10CreateShaderResourceViewFromMemory 這個函式, 不知道能不能實作我要的功能, 有一個D3DX10_IMAGE_LOAD_INFO 要填, 嘗試了很多填法依然創建不成功, 然后就在官方samples里面找到了一個從memory里面加載的例子。 但是它那個里面的資料流是dds的。。。可以加載 但是我自己只有 RGBA的資料流。。。。用它的引數去填 D3DX10_IMAGE_LOAD_INFO 是加載不了的 有沒有大神知道怎么弄 謝了!~!!!!!
uj5u.com熱心網友回復:
有沒有轉換函式啊uj5u.com熱心網友回復:
僅供參考:#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <conio.h>
#include <windows.h>
#include <atlimage.h>
#include <objidl.h>
void DrawPic(HDC hdc,char *buf,int len) {
HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len);
BYTE* pMem=(BYTE*)GlobalLock(hMem);
memcpy(pMem,buf,len);
IStream* pStream;
HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStream);
CImage img;
img.Load(pStream);
img.Draw(hdc,CPoint(0,0));
img.Destroy();
pStream->Release();
GlobalUnlock(hMem);
GlobalFree(hMem);
}
//HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
CONSOLE_CURSOR_INFO cciCursor;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
cciCursor.bVisible = FALSE;
SetConsoleCursorInfo(hStdOut, &cciCursor);
}
}
void ShowTheCursor() {
CONSOLE_CURSOR_INFO cciCursor;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
cciCursor.bVisible = TRUE;
SetConsoleCursorInfo(hStdOut, &cciCursor);
}
}
int main() {
HWND hwnd;
HDC hdc;
HFONT hfont;
HBITMAP hbm;
HDC hdcBits;
BITMAP bm;
system("color F0");
system("cls");
HideTheCursor();
hwnd = GetConsoleWindow();
hdc = GetDC(hwnd);
hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "華文楷體");
SelectObject(hdc,hfont);
TextOut(hdc,10,10,"這是泡泡",8);
DeleteObject(hfont);
hbm=(HBITMAP)LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
if (hbm) {
hdcBits = CreateCompatibleDC(hdc);
GetObject (hbm, sizeof(BITMAP), &bm);
SelectObject(hdcBits,hbm);
BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);
DeleteDC(hdcBits);
DeleteObject(hbm);
}
getch();
FILE *f;
f=fopen("c:\\new\\tmp.jpg","rb");
if (f) {
int fl=filelength(fileno(f));
char *buf=(char *)malloc(fl);
if (buf) {
fread(buf,fl,1,f);
}
fclose(f);
if (buf) {
DrawPic(hdc,buf,fl);
free(buf);
}
}
ReleaseDC(hwnd,hdc);
getch();
system("color 07");
system("cls");
ShowTheCursor();
return 0;
}
uj5u.com熱心網友回復:
給你一個以前寫的從記憶體中加載類似bmp格式的函式吧struct WIMAGE{
short width;
short height;
short ox;
short oy;
};
bool CImageResource::GetImage(_In_ DWORD nImg,HTEXTURE& texture,_Out_ WIMAGE& img)
{
const COLORREF keyColor = RGB(0,0,0);
if ( nImg >= m_imgCount )
return false;
if ( m_Textures[nImg] )
{
texture = m_Textures[nImg];
img = m_Images[nImg];
return true;
}
WIMAGE* wi = &m_Images[nImg];
//下面是關鍵代碼
char* lpImageData;
DWORD dwPerLine;
DWORD dwPerPixelBits;
if ( m_ColorDepth == 256 )
dwPerPixelBits = 1;
else
dwPerPixelBits = 2;
DWORD dwPad = (1000*dwPerPixelBits)%4;
dwPerLine =1000*dwPerPixelBits + 4 - ((dwPad==0) ? 4 : dwPad);
DWORD dwTrueOffset = m_Offsets[nImg] % m_dwAlloc;
lpImageData = (char*)MapViewOfFile(m_hMapped,FILE_MAP_READ,0,m_Offsets[nImg] - dwTrueOffset,dwPerLine*1000+dwTrueOffset);
if (!lpImageData)
return false;
*wi = *(WIMAGE*)(lpImageData + dwTrueOffset);
dwPerLine =wi->width*dwPerPixelBits + 4 - ((dwPad==0) ? 4 : dwPad);
//創建紋理
m_Textures[nImg] = lzy->Texture_Create(wi->width,wi->height);
if (!m_Textures[nImg])
{
UnmapViewOfFile(lpImageData);
return false;
}
byte* ptr = (byte*)lzy->Texture_Lock(m_Textures[nImg]);
if (!ptr)
{
lzy->Texture_Free(m_Textures[nImg]);
UnmapViewOfFile(lpImageData);
return false;
}
char* lpTrueData = lpImageData + dwTrueOffset + 8;
if ( m_ColorDepth == 256 )
{
for (int i=0;i < wi->height;i++)
{
for (int j=0;j<wi->width;j++)
{
byte* idx = (byte*)(lpTrueData + (wi->height-1-i)*dwPerLine + j);
byte* temp = ptr + (j+i*wi->width)*4;
RGBQUAD& col = m_Patteles[*idx];
*temp++ = col.rgbBlue;
*temp++ = col.rgbGreen;
*temp++ = col.rgbRed;
if ( col.rgbRed == GetRValue(keyColor) && col.rgbGreen == GetGValue(keyColor) && col.rgbBlue == GetBValue(keyColor) )
*temp++ = 0;
else
*temp++ = 0xFF;
}
}
}
else if (m_ColorDepth == 65536 )
{
for (int i=0;i < wi->height;i++)
{
for (int j=0;j<wi->width;j++)
{
WORD* col = (WORD*)(lpTrueData + (wi->height-1-i)*dwPerLine + j*2);
byte* temp = ptr + (j+i*wi->width)*4;
byte b = ((*col)&0x001F)<<3;
byte g = ((*col)&0x07E0)>>3;
byte r = ((*col)&0xF800)>>8;
*temp++ =b;
*temp++ =g;
*temp++ =r;
if ( r == GetRValue(keyColor) && g == GetGValue(keyColor) && b == GetBValue(keyColor) )
*temp++ = 0;
else
*temp++ = 0xFF;
}
}
}
else
{
printf("unknown wil image format!");
}
lzy->Texture_Unlock(m_Textures[nImg]);
UnmapViewOfFile(lpImageData);
texture = m_Textures[nImg];
img = *wi;
return true;
}
uj5u.com熱心網友回復:
暈,發錯了!大概講一下
1. 用ID3D10Device::CreateTextureND創建一個N維的w*h的紋理(N一般是2)
2.根據你創建時所標記的格式 比如DXGI_FORMAT_R8G8B8A8_UINT ,就表示RGBA歌占8位元
3.填充一個 該格式的陣列[w*h],
4.用ID3D10Device::UpdateSubResource更新到創建的紋理中去
5.完工
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/64012.html
標籤:圖形處理/算法
下一篇:曲面t樣條的重構演算法
