C++有像素点坐标和RGB值,怎么创建一幅图像?
5个回答
展开全部
我有一个 API 程序,可以用于“画”image。
输入文件是 ASCII 文件,第一行 是2 个 整数,用空白分隔,第一个是 宽度(像素点点数)w,第二个是 高度(像素点点数)h
第二行起 是 16进制 数,数值 是RGB,每个数2位, 也就是 %2x%2x%2x 格式 到底。共有像素点 w*h 个。当然,你愿意每行加个换行符号也可以。
运行时 打入: 程序名 RGB值文件名
程序如下(里面可能含一些无用的码,因为是从别的应用程序简化来的):
/* =======================================================*
// cl show_rgb.cpp
// for rainbow
// img rgb file:
// line1: img_w img_h
// line2...: RRGGBBrrggbbRRGGBB in %2X%2X%2X and no space
L_o_o_n_i_e
* ========================================================*/
#include <Afxwin.h>
#include <process.h>
#include <math.h>
#include <Winuser.h>
#define DEBUG 1
#pragma comment (lib, "User32.lib")
HWND hWndMain;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
void OnDisplayMessage(char *str);
char one_line[80],pname[80],namein[80],str[120];
int len,NN;
LPTSTR argv;
FILE *fin;
RECT RectX;
int RectDy,RectW,RectH;
int x_r=495,x_g=495,x_b=495,x_shift=10,y_shift=20;
long int v_r,v_g,v_b;
COLORREF *img;
int img_w,img_h;
unsigned char rr,gg,bb;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
MSG Msg;
int i,j,k;
//get cmd line
argv = GetCommandLine();
len = strlen(argv);
sprintf(one_line,"%s",argv);
i = sscanf(one_line,"%s %s",&pname[0],&namein[0]);
if (i < 2 ) {sprintf(str,"Usage: %s namein\n",pname); OnDisplayMessage(str);exit(0);};
if ( (fin = fopen(namein,"r"))==NULL) {
sprintf(str,"Can not open %s",namein); OnDisplayMessage( str);exit(0);
};
fscanf(fin,"%d %d\n",&img_w,&img_h);
if (DEBUG==1){
sprintf(str,"img_w=%d img_h=%d\n",img_w,img_h);
OnDisplayMessage( str);
}
img = (COLORREF *) malloc (sizeof(COLORREF) * img_w * img_h);
if (!img){
sprintf(str,"No enough memory foe img"); OnDisplayMessage( str);exit(0);
}
k=0;
for (j=0;j<img_h;j++) for (i=0;i<img_w;i++){
fscanf(fin,"%2x%2x%2x",&rr,&gg,&bb);
img[k]=RGB(rr,gg,bb);k++;
};
fclose(fin);
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
ShowWindow(hWndMain,nCmdShow);
UpdateWindow(hWndMain);
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static long nXChar,nYChar,xInc,yInc;
static int xClient, yClient;
static int xClientMax;
static int xChar, yChar;
static int xPos,yPos;
static int xMax,yMax;
SCROLLINFO si;
HDC hdc;
short x;
TEXTMETRIC tm;
PAINTSTRUCT ps;
COLORREF color;
HFONT font;
HPEN hP1; // pen
HBRUSH hBr,hBrR,hBrG,hBrB;
CPoint aP,mousePos;
HWND h_wnd2;
int i,j,k;
switch(message)
{
case WM_CREATE:
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
nXChar=tm.tmAveCharWidth;
nYChar=tm.tmHeight;
xInc=1;yInc=1; xChar=nXChar; yChar=nYChar; // for scroll window
ReleaseDC(hwnd,hdc);
xClientMax = 800;
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps); // begin paint
SetGraphicsMode(hdc,GM_ADVANCED);
SetWindowExtEx(hdc,700,400,NULL); // cx=700,cy=400 logical unit
SetViewportExtEx(hdc,600,400,NULL);
SetViewportOrgEx(hdc,x_shift,10,NULL);
SetMapMode(hdc,MM_ANISOTROPIC);
font=CreateFont(
24,10,0,0, FW_NORMAL,0,0,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,NULL,"myfont"
);
SelectObject(hdc,font);
GetTextMetrics(hdc,&tm);
nYChar=tm.tmHeight;
hBr = CreateSolidBrush(RGB(255,255,255));
SelectObject(hdc,hBr);
RectX.left= x_shift; RectX.right=RectX.left + 400;
RectX.bottom = y_shift; RectX.top = RectX.bottom + 400;
FillRect(hdc, &RectX, hBr);
k=0;
for (j=0;j<img_h;j++){
for (i=0;i<img_w;i++){
hBr = CreateSolidBrush(img[k]); k++;
SelectObject(hdc,hBr);
RectX.left= x_shift + i; RectX.right=RectX.left+ 1;
RectX.bottom = y_shift + j; RectX.top = RectX.bottom + 1;
FillRect(hdc, &RectX, hBr);
DeleteObject(hBr);
}
}
EndPaint(hwnd,&ps); // end paint
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
}
BOOL InitWindowsClass(HINSTANCE hInstance)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,"END");
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName="Windows Fill";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
return(RegisterClass(&wndclass));
}
void OnDisplayMessage(char *str)
{
HWND hWnd;
MessageBox(NULL,str,"show_rgb_info",MB_OK); // API
}
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hWnd=CreateWindow( "Windows Fill", "Show_color",
WS_OVERLAPPEDWINDOW | WS_SYSMENU | WS_BORDER | WS_HSCROLL | WS_VSCROLL, 100,100,800,400, NULL, NULL, hInstance, NULL );
if(!hWnd) return FALSE;
hWndMain=hWnd;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
输入文件是 ASCII 文件,第一行 是2 个 整数,用空白分隔,第一个是 宽度(像素点点数)w,第二个是 高度(像素点点数)h
第二行起 是 16进制 数,数值 是RGB,每个数2位, 也就是 %2x%2x%2x 格式 到底。共有像素点 w*h 个。当然,你愿意每行加个换行符号也可以。
运行时 打入: 程序名 RGB值文件名
程序如下(里面可能含一些无用的码,因为是从别的应用程序简化来的):
/* =======================================================*
// cl show_rgb.cpp
// for rainbow
// img rgb file:
// line1: img_w img_h
// line2...: RRGGBBrrggbbRRGGBB in %2X%2X%2X and no space
L_o_o_n_i_e
* ========================================================*/
#include <Afxwin.h>
#include <process.h>
#include <math.h>
#include <Winuser.h>
#define DEBUG 1
#pragma comment (lib, "User32.lib")
HWND hWndMain;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
void OnDisplayMessage(char *str);
char one_line[80],pname[80],namein[80],str[120];
int len,NN;
LPTSTR argv;
FILE *fin;
RECT RectX;
int RectDy,RectW,RectH;
int x_r=495,x_g=495,x_b=495,x_shift=10,y_shift=20;
long int v_r,v_g,v_b;
COLORREF *img;
int img_w,img_h;
unsigned char rr,gg,bb;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
MSG Msg;
int i,j,k;
//get cmd line
argv = GetCommandLine();
len = strlen(argv);
sprintf(one_line,"%s",argv);
i = sscanf(one_line,"%s %s",&pname[0],&namein[0]);
if (i < 2 ) {sprintf(str,"Usage: %s namein\n",pname); OnDisplayMessage(str);exit(0);};
if ( (fin = fopen(namein,"r"))==NULL) {
sprintf(str,"Can not open %s",namein); OnDisplayMessage( str);exit(0);
};
fscanf(fin,"%d %d\n",&img_w,&img_h);
if (DEBUG==1){
sprintf(str,"img_w=%d img_h=%d\n",img_w,img_h);
OnDisplayMessage( str);
}
img = (COLORREF *) malloc (sizeof(COLORREF) * img_w * img_h);
if (!img){
sprintf(str,"No enough memory foe img"); OnDisplayMessage( str);exit(0);
}
k=0;
for (j=0;j<img_h;j++) for (i=0;i<img_w;i++){
fscanf(fin,"%2x%2x%2x",&rr,&gg,&bb);
img[k]=RGB(rr,gg,bb);k++;
};
fclose(fin);
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
ShowWindow(hWndMain,nCmdShow);
UpdateWindow(hWndMain);
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static long nXChar,nYChar,xInc,yInc;
static int xClient, yClient;
static int xClientMax;
static int xChar, yChar;
static int xPos,yPos;
static int xMax,yMax;
SCROLLINFO si;
HDC hdc;
short x;
TEXTMETRIC tm;
PAINTSTRUCT ps;
COLORREF color;
HFONT font;
HPEN hP1; // pen
HBRUSH hBr,hBrR,hBrG,hBrB;
CPoint aP,mousePos;
HWND h_wnd2;
int i,j,k;
switch(message)
{
case WM_CREATE:
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
nXChar=tm.tmAveCharWidth;
nYChar=tm.tmHeight;
xInc=1;yInc=1; xChar=nXChar; yChar=nYChar; // for scroll window
ReleaseDC(hwnd,hdc);
xClientMax = 800;
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps); // begin paint
SetGraphicsMode(hdc,GM_ADVANCED);
SetWindowExtEx(hdc,700,400,NULL); // cx=700,cy=400 logical unit
SetViewportExtEx(hdc,600,400,NULL);
SetViewportOrgEx(hdc,x_shift,10,NULL);
SetMapMode(hdc,MM_ANISOTROPIC);
font=CreateFont(
24,10,0,0, FW_NORMAL,0,0,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,NULL,"myfont"
);
SelectObject(hdc,font);
GetTextMetrics(hdc,&tm);
nYChar=tm.tmHeight;
hBr = CreateSolidBrush(RGB(255,255,255));
SelectObject(hdc,hBr);
RectX.left= x_shift; RectX.right=RectX.left + 400;
RectX.bottom = y_shift; RectX.top = RectX.bottom + 400;
FillRect(hdc, &RectX, hBr);
k=0;
for (j=0;j<img_h;j++){
for (i=0;i<img_w;i++){
hBr = CreateSolidBrush(img[k]); k++;
SelectObject(hdc,hBr);
RectX.left= x_shift + i; RectX.right=RectX.left+ 1;
RectX.bottom = y_shift + j; RectX.top = RectX.bottom + 1;
FillRect(hdc, &RectX, hBr);
DeleteObject(hBr);
}
}
EndPaint(hwnd,&ps); // end paint
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
}
BOOL InitWindowsClass(HINSTANCE hInstance)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,"END");
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName="Windows Fill";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
return(RegisterClass(&wndclass));
}
void OnDisplayMessage(char *str)
{
HWND hWnd;
MessageBox(NULL,str,"show_rgb_info",MB_OK); // API
}
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hWnd=CreateWindow( "Windows Fill", "Show_color",
WS_OVERLAPPEDWINDOW | WS_SYSMENU | WS_BORDER | WS_HSCROLL | WS_VSCROLL, 100,100,800,400, NULL, NULL, hInstance, NULL );
if(!hWnd) return FALSE;
hWndMain=hWnd;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
展开全部
首先创建变量BITMAPINFO bi;并填充各成员变量,
然后创建数组BYTE rgb[3*Width*Height];
将RGB值输入到rgb数组里面就行了,没3个byte代表一个rgb值
如rgb[0],rgb[1],rgb[2]代表第一个像素的rgb值,
最后调用StretchDIBits输出rgb这个图像就行了。
然后创建数组BYTE rgb[3*Width*Height];
将RGB值输入到rgb数组里面就行了,没3个byte代表一个rgb值
如rgb[0],rgb[1],rgb[2]代表第一个像素的rgb值,
最后调用StretchDIBits输出rgb这个图像就行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以先创建一个空的jpg,然后,将你的内容写入jpg,创建空的jpg主要是创建jpg信息,告诉读取者这是一个jpg图像。
更多追问追答
追问
求程序?
追答
这个我大体给你写个伪代码;
handle emptyjpg=createjpg();//或者可以用createfile创建空jpg
setjpg(像素,rgb);//反复调用直到将你所有的像素全设置完毕。
自己可以去查下函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1 创建一个画图空间,也就是面板。空间大小要可以容纳下所有合法坐标。
2 将面板情况。即所有元素置为0,使面板为白色。
3 根据像素点坐标,和RGB值,对对应点赋值。RGB转换为值的操作为
R<<24 | G<<16 | B | 0xff000000
2 将面板情况。即所有元素置为0,使面板为白色。
3 根据像素点坐标,和RGB值,对对应点赋值。RGB转换为值的操作为
R<<24 | G<<16 | B | 0xff000000
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以看看BMP的文件格式
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询