A. c\c++用於顯示jpg格式的代碼。 關鍵代碼或函數。
1、如何從BMP圖片讀取每個像素,然後根據PNG圖片的格式以及RGB色彩演算法,將BMP像素轉換成png圖片,最後根據PNG格式輸出到文件。
常式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
FILE *fp = NULL;
char buf[PNG_BYTES_TO_CHECK];
LPSTR lpszFileName = lpszPathName;
if(!lpszFileName) return false;
//打開<a href="https://www..com/s?wd=PNG%E6%96%87%E4%BB%B6&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-TLwGUv3EnWc4nHcvnHc" target="_blank" class="-highlight">PNG文件</a>
if(NULL == (fp = fopen(lpszFileName,"rb")))
{
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
//驗證是否為<a href="https://www..com/s?wd=PNG%E6%96%87%E4%BB%B6&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-TLwGUv3EnWc4nHcvnHc" target="_blank" class="-highlight">PNG文件</a>
if(fread(buf,1,PNG_BYTES_TO_CHECK,fp) != PNG_BYTES_TO_CHECK)
{
fclose(fp);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
if( 0 != png_sig_cmp((unsigned char*)buf,(png_size_t)0,PNG_BYTES_TO_CHECK))
{
fclose(fp);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
//以下代碼讀取<a href="https://www..com/s?wd=PNG%E6%96%87%E4%BB%B6&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-TLwGUv3EnWc4nHcvnHc" target="_blank" class="-highlight">PNG文件</a>
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
unsigned int sig_read = PNG_BYTES_TO_CHECK;
int color_type = 0,interlace_type = 0;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
if( NULL == png_ptr)
{
fclose(fp);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
info_ptr = png_create_info_struct(png_ptr);
if(NULL == info_ptr)
{
fclose(fp);
png_destroy_read_struct(&png_ptr,&info_ptr,png_infopp_NULL);
delete []lpszFileName;
lpszFileName = NULL;
return false;
}
png_init_io(png_ptr,fp);
png_set_sig_bytes(png_ptr,sig_read);
png_read_info(png_ptr,info_ptr);
if(info_ptr->bit_depth == 16)png_set_strip_16(png_ptr);
if(info_ptr->color_type == PNG_COLOR_TYPE_GRAY && info_ptr->pixel_depth < 8)
png_set_gray_1_2_4_to_8(png_ptr);
switch (info_ptr->pixel_depth)
{
case 32:
if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)png_set_bgr(png_ptr);
png_set_invert_alpha(png_ptr);
//當為32點陣圖像是應該如何處理,例如
//pDib->CreateDIB(info_ptr->width, info_ptr->height,32);
break;
case 24:
{
png_color_16 my_background={0,255,255,255,0};
png_set_background(png_ptr,&my_background,
PNG_BACKGROUND_GAMMA_SCREEN,0,1.0);
if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)png_set_bgr(png_ptr);
//當為32點陣圖像是應該如何處理,例如
//pDib->CreateDIB(info_ptr->width, info_ptr->height,24);
}
break;
case 8:
case 4:
//當為32點陣圖像是應該如何處理,例如
//if(info_ptr->num_palette>0)
//{
// DWORD *pRQ=new DWORD[info_ptr->num_palette];
// for(int i=0;i<info_ptr->num_palette;i++)
// {
// pRQ[i]=RGB(info_ptr->palette[i].red,info_ptr->palette[i].green,info_ptr->palette[i].blue);
// }
// pDib->CreateDIB(info_ptr->width, info_ptr->height,info_ptr->pixel_depth,pRQ,info_ptr->num_palette);
// delete[] pRQ;
//}
break;
default:
return false;
}
png_bytepp prow_pointers = new png_bytep[info_ptr->height];
UINT nRowBytes = png_get_rowbytes(png_ptr,info_ptr);
UINT row;
for(row=0;row<info_ptr->height;row++)
prow_pointers[row]=new BYTE[nRowBytes];
png_read_image(png_ptr,prow_pointers);
png_read_end(png_ptr,info_ptr);
//拷貝轉換後的圖像數據
for(row=0;row<info_ptr->height;row++)
memcpy(pDib->m_lpImage+(info_ptr->height-row-1)*pDib->m_nByteWidth,
prow_pointers[row],pDib->m_nByteWidth);
2、更簡單的方法:用windows自帶的圖片和傳真查看器打開要轉換的圖片,點擊右下角的保存按鈕,彈出保存對話框,選擇要保存的類型。筆者經實驗可轉換的類型為gif,bmp,png,jpg.最大的優點是方便且不失。
B. C語言怎樣顯示一張圖片
1、如果有圖片(例如 wzzx.jpg) 程序中插一句:
system("mspaint wzzx.jpg"); 就可以 在運行時顯示這張圖片。
用字元串變數調用也可以:
char pic_name[80]="wzzx.jpg";
char cmd[100];
sprintf(cmd,"mspaint %s",pic_name);
system(cmd); // 顯示圖片
2、system函數:
原型:int system(const char * command);
功能:執行 dos(windows系統) 或 shell(Linux/Unix系統) 命令,參數字元串command為命令名;
說明:在windows系統中,system函數直接在控制台調用一個command命令。在Linux/Unix系統中,system函數會調用fork函數產生子進程,由子進程來執行command命令,命令執行完後隨即返回原調用的進程;
頭文件:stdlib.h;
返回值:命令執行成功返回0,執行失敗返回-1。
C. c語言dos下如何顯示jpg圖片
jpg 文件結構非常復雜,除非你安裝和調用已開發好的庫,自己從0開始寫程序要花很多時間,一兩個星期是攻不下來的。
簡單地顯示,可以調微軟的Paint.
如果要顯示 abc.jpg 用下面 C 程序。
#include <stdio.h>
main(){
system("mspaint abc.jpg");
return 0;
}
========
復雜一點,輸入jpeg 文件名,組成system(命令):
char p[80],cm[120];
printf("please input jpeg name\n");
gets(p);
sprintf(cm,"mspaint %s",p);
system(cm);
D. 用C語言實現,簡單的告訴我,怎麼讀取當前目錄下的一個jpg圖像,並且顯示出來
FILE *fp;
if((fp = fopen("sb.jpg","r") == NULL)) {
printf("\nerror");
exit(0);
}
以上僅僅能打開jpg文件,想要顯示需要窗口編程。win32或者MFC來實現。
E. 怎樣用C語言顯示一張jpg的圖片呢
可以用函數OleLoadPicture從包含有圖像數據的流中裝載圖像。
具體實現代碼如下:
//在顯示圖像之前,首先要獲取到圖像文件的存放路徑,這里採用標準的文件打開對話框來選取圖像文件,文件名存放在CString型的變數m_sPath中:
CFileDialogdlg(TRUE,"jpg","*.jpg",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||",NULL);
if(dlg.DoModal()==IDOK)
{
m_sPath=dlg.GetPathName();
Invalidate();
}
//為簡單計,圖形顯示的代碼直接在視類中的OnDraw中編寫,首先打開文件並判斷文件的可用性,並把文件內容放到流介面IStream的對象pStm中:
IStream*pStm;
CFileStatusfstatus;
CFilefile;
LONGcb;
……
if(file.Open(m_Path,CFile::modeRead)&&file.GetStatus(m_Path,fstatus)&&((cb=fstatus.m_size)!=-1))
{
HGLOBALhGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);
LPVOIDpvData=NULL;
if(hGlobal!=NULL)
{
if((pvData=GlobalLock(hGlobal))!=NULL)
{
file.ReadHuge(pvData,cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
}
}
}
//然後,就直接調用OleLoadPicture函數從流中裝載圖像:
IPicture*pPic;
……
OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic));
//由於該函數有時會導致失敗,所以應當用SUCCEEDED宏來做一些適當的保護工作,只有在數據裝載成功的前提下才能繼續下面的圖像顯示工作:
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIChmWidth;
OLE_YSIZE_HIMETRIChmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
doublefX,fY;
……
fX=(double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY=(double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("渲染圖像失敗!");
pPic->Release();
}
else
AfxMessageBox("從流中裝載圖像失敗!");//其中,顯示工作主要是由IPicture介面對象的Render函數來完成的,該函數主要用來將圖片的指定部分畫到指定的設備環境的指定位置。
原型如下:
HRESULTRender(HDChdc,//渲染圖像用的設備環境句柄
longx,//在hdc上的水平坐標
longy,//在hdc上的垂直坐標
longcx,//圖像寬度
longcy,//圖像高度
OLE_XPOS_HIMETRICxSrc,//在源圖像上的水平偏移
OLE_YPOS_HIMETRICySrc,//在源圖像上的垂直偏移
OLE_XSIZE_HIMETRICcxSrc,//在源圖像上水平拷貝的數量
OLE_YSIZE_HIMETRICcySrc,//在源圖像上垂直拷貝的數量
LPCRECTprcWBounds//指向目標圖元設備環境句柄的指針);
F. c++如何打開一張jpg圖片
c++打開jpg方法如下:
1.圖片也是屬於文件類型的一種,圖片屬於二進制文件。使用fopen函數的二進制模式「rb」就可以打開。
2.常式:
#include <stdlib.h>
#include <stdio.h>
int main ()
{
FILE * fpPhoto, * fpText, * fpTarget ;
int iRead ;
char szBuf[100] ;
printf ("請輸入第一個文件名(jpg):\n") ;
gets (szBuf) ;
fpPhoto = fopen (szBuf, "rb") ;
printf ("請輸入第二個文件名(txt):\n") ;
gets (szBuf) ;
fpText = fopen (szBuf, "rb") ;
printf ("請輸入目的文件名(jpg):\n") ;
gets (szBuf) ;
fpTarget = fopen (szBuf, "wb") ;
if (!fpPhoto || !fpText || !fpTarget)
{
printf ("打開文件失敗!\n") ;
system("pause") ;
return -1 ;
}
while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpPhoto)) > 0)
fwrite (szBuf, 1, iRead, fpTarget) ;
while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpText)) > 0)
fwrite (szBuf, 1, iRead, fpTarget) ;
fclose (fpPhoto) ;
fclose (fpText) ;
fclose (fpTarget) ;
return 0 ;
}
G. 用c語言如何讀取和保存jpg圖片文件
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int file_size(char* filename)//獲取文件名為filename的文件大小。
{
FILE *fp = fopen(filename, "rb");//打開文件。
int size;
if(fp == NULL) // 打開文件失敗
return -1;
fseek(fp, 0, SEEK_END);//定位文件指針到文件尾。
size=ftell(fp);//獲取文件指針偏移量,即文件大小。
fclose(fp);//關閉文件。
return size;
}
int main ()
{
int size=0;
size=file_size("qw");
printf("%d ",size);
FILE * pFile,*qw;
char *buffer=(char*)malloc(sizeof(char)*size);
qw =fopen("qw","r");
pFile = fopen ( "qwe" , "wb" );
printf("%d== ",pFile);
printf("%d ",size);
fread(buffer,1,size,qw);
fwrite (buffer , sizeof(byte), size , pFile );
fclose (pFile);
rename("qwe","Groot.jpg");
return 0;
}
(7)如何用c代碼顯示jpg圖片擴展閱讀:
c語言讀取TXT文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 1024
int main()
{
char buf[MAX_LINE]; /*緩沖區*/
FILE *fp; /*文件指針*/
int len; /*行字元個數*/
if((fp = fopen("test.txt","r")) == NULL)
{
perror("fail to read");
exit (1) ;
}
while(fgets(buf,MAX_LINE,fp) != NULL)
{
len = strlen(buf);
buf[len-1] = '