亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jpeg.cpp

?? 這是VC++ 2003.net圖像處理的光盤源程序!!!非常好的
?? CPP
字號:
// Jpeg.cpp: implementation of the CJpeg class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
   
#ifdef __cplusplus
	extern "C" {
#endif // __cplusplus

#include "jpeglib.h"

#ifdef __cplusplus
	}
#endif // __cplusplus

//
//
//

/*
 * <setjmp.h> is used for the optional error recovery mechanism shown in
 * the second part of the example.
 */

#include <setjmp.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

// error handler, to avoid those pesky exit(0)'s

struct my_error_mgr {
  struct jpeg_error_mgr pub;	/* "public" fields */
  jmp_buf setjmp_buffer;	/* for return to caller */
};

typedef struct my_error_mgr * my_error_ptr;

//
//
//

METHODDEF(void) my_error_exit (j_common_ptr cinfo);

//
//	to handle fatal errors.
//	the original JPEG code will just exit(0). can't really
//	do that in Windows....
//
METHODDEF(void) my_error_exit (j_common_ptr cinfo)
{
	/* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
	my_error_ptr myerr = (my_error_ptr) cinfo->err;

	char buffer[JMSG_LENGTH_MAX];

	/* Create the message */
	(*cinfo->err->format_message) (cinfo, buffer);

	/* Always display the message. */
	MessageBox(GetActiveWindow(),buffer,"JPEG Fatal Error",MB_ICONSTOP);


	/* Return control to the setjmp point */
	longjmp(myerr->setjmp_buffer, 1);
}


// load gif file
BOOL  CImage::LoadJPEG(LPCSTR lpstrFileName)
{
	UINT	uWidth, uHeight;
	BYTE	*lpTmpBuffer;
   	BYTE    *buf1,*buf2;
  	int		i,j,k,nJPEGBytesPerLine;

	lpTmpBuffer = ReadJPEGFile(lpstrFileName, &uWidth, &uHeight);
	if (lpTmpBuffer == NULL)
		return FALSE;
 
	Create(uWidth,uHeight,24,0);
 	
   	buf1=(BYTE*) lpBits+(nHeight-1)*nBytesPerLine;
	buf2=(BYTE*) lpTmpBuffer;
	nJPEGBytesPerLine=3*nWidth;
   	for (j=0;j<nHeight;j++) {
		for (i=0,k=0;i<nWidth;i++,k+=nBytesPerPixel) {
			buf1[k+2]=buf2[k];
			buf1[k+1]=buf2[k+1];
 			buf1[k]  =buf2[k+2];
		}
 		buf1-=nBytesPerLine;
		buf2+=nJPEGBytesPerLine;
	}
	
	free(lpTmpBuffer);
	return TRUE;
}

// save Jpeg file
BOOL  CImage::SaveJPEG(LPCSTR lpstrFileName)
{
	BOOL	bSuccess,bColor;
	BYTE	*tmp,*buf1,*buf2;
	int		i,j,k,Bpl,nJPEGBytesPerLine,nQuality;
      
	if (nBitCount<8) 
		return(FALSE);
  
	Bpl=nBytesPerLine;
	if (nBitCount==8) Bpl *= 3;
	tmp =(BYTE*) malloc(Bpl*nHeight);
   	buf1=(BYTE*) lpBits+(nHeight-1)*nBytesPerLine;
	buf2=(BYTE*) tmp;
	nJPEGBytesPerLine=3*nWidth;
	if (nBitCount==24) {
		bColor=TRUE;
 		for (j=0;j<nHeight;j++) {
			for (i=0,k=0;i<nWidth;i++,k+=3) {
				buf2[k+2]=buf1[k];
				buf2[k+1]=buf1[k+1];
				buf2[k]  =buf1[k+2];
			}
			buf1-=nBytesPerLine;
			buf2+=nJPEGBytesPerLine;
		}
	}
	else if (nBitCount==8) {
		bColor=FALSE;
 		for (j=0;j<nHeight;j++) {
			for (i=0,k=0;i<nWidth;i++,k+=3) {
				buf2[k+2]=buf1[i];
				buf2[k+1]=buf1[i];
				buf2[k]  =buf1[i];
			}
			buf1-=nBytesPerLine;
			buf2+=nJPEGBytesPerLine;
		}
	}
 	
 	nQuality=90;
	bSuccess = WriteJPEGFile(lpstrFileName,
							tmp,
							nWidth, 
							nHeight,
							bColor,
							nQuality);
   	free(tmp);

	return bSuccess;
}

//
//	read a JPEG file
//
BYTE*  ReadJPEGFile(LPCSTR lpstrFileName, UINT *uWidth, UINT *uHeight)
{
	// basic code from IJG Jpeg Code v6 example.c

	*uWidth=0;
	*uHeight=0;

	/* This struct contains the JPEG decompression parameters and pointers to
	* working space (which is allocated as needed by the JPEG library).
	*/
	struct jpeg_decompress_struct cinfo;
	/* We use our private extension JPEG error handler.
	* Note that this struct must live as long as the main JPEG parameter
	* struct, to avoid dangling-pointer problems.
	*/
	struct my_error_mgr jerr;
	/* More stuff */
	FILE * infile;		/* source file */
	JSAMPARRAY buffer;		/* Output row buffer */
	int row_stride;		/* physical row width in output buffer */
	char buf[250];

	/* In this example we want to open the input file before doing anything else,
	* so that the setjmp() error recovery below can assume the file is open.
	* VERY IMPORTANT: use "b" option to fopen() if you are on a machine that
	* requires it in order to read binary files.
	*/

	if ((infile = fopen(lpstrFileName, "rb")) == NULL) 
	{
		sprintf(buf, "JPEG :\nCan't open %s\n", lpstrFileName);
//		strJPEGErrorA = buf;
		return NULL;
	}

	/* Step 1: allocate and initialize JPEG decompression object */

	/* We set up the normal JPEG error routines, then override error_exit. */
	cinfo.err = jpeg_std_error(&jerr.pub);
	jerr.pub.error_exit = my_error_exit;


	/* Establish the setjmp return context for my_error_exit to use. */
	if (setjmp(jerr.setjmp_buffer)) 
	{
		/* If we get here, the JPEG code has signaled an error.
		 * We need to clean up the JPEG object, close the input file, and return.
		 */

		jpeg_destroy_decompress(&cinfo);
		fclose(infile);
		return NULL;
	}

	/* Now we can initialize the JPEG decompression object. */
	jpeg_create_decompress(&cinfo);

	/* Step 2: specify data source (eg, a file) */

	jpeg_stdio_src(&cinfo, infile);

	/* Step 3: read file parameters with jpeg_read_header() */

	(void) jpeg_read_header(&cinfo, TRUE);
	/* We can ignore the return value from jpeg_read_header since
	*   (a) suspension is not possible with the stdio data source, and
	*   (b) we passed TRUE to reject a tables-only JPEG file as an error.
	* See libjpeg.doc for more info.
	*/

	/* Step 4: set parameters for decompression */

	/* In this example, we don't need to change any of the defaults set by
	* jpeg_read_header(), so we do nothing here.
	*/

	/* Step 5: Start decompressor */

	(void) jpeg_start_decompress(&cinfo);
	/* We can ignore the return value since suspension is not possible
	* with the stdio data source.
	*/

	/* We may need to do some setup of our own at this point before reading
	* the data.  After jpeg_start_decompress() we have the correct scaled
	* output image dimensions available, as well as the output colormap
	* if we asked for color quantization.
	* In this example, we need to make an output work buffer of the right size.
	*/ 

	// get our buffer set to hold data
	BYTE *dataBuf;

	////////////////////////////////////////////////////////////
	// alloc and open our new buffer
	dataBuf=(BYTE *)new BYTE[cinfo.output_width * 3 * cinfo.output_height];
	if (dataBuf==NULL) 
	{

//		strJPEGErrorA = "JpegFile :\nOut of memory";

		jpeg_destroy_decompress(&cinfo);
		
		fclose(infile);

		return NULL;
	}

	// how big is this thing gonna be?
	*uWidth = cinfo.output_width;
	*uHeight = cinfo.output_height;
	
	/* JSAMPLEs per row in output buffer */
	row_stride = cinfo.output_width * cinfo.output_components;

	/* Make a one-row-high sample array that will go away when done with image */
	buffer = (*cinfo.mem->alloc_sarray)
		((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);

	/* Step 6: while (scan lines remain to be read) */
	/*           jpeg_read_scanlines(...); */

	/* Here we use the library's state variable cinfo.output_scanline as the
	* loop counter, so that we don't have to keep track ourselves.
	*/
	while (cinfo.output_scanline < cinfo.output_height) 
	{
		/* jpeg_read_scanlines expects an array of pointers to scanlines.
		 * Here the array is only one element long, but you could ask for
		 * more than one scanline at a time if that's more convenient.
		 */
		(void) jpeg_read_scanlines(&cinfo, buffer, 1);
		/* Assume put_scanline_someplace wants a pointer and sample count. */

		// asuumer all 3-components are RGBs
		if (cinfo.out_color_components==3) 
		{
			
			j_putRGBScanline(buffer[0], 
							*uWidth,
							dataBuf,
							cinfo.output_scanline-1);

		} 
		else if (cinfo.out_color_components==1) 
		{

			// assume all single component images are grayscale
			j_putGrayScanlineToRGB(buffer[0], 
								*uWidth,
								dataBuf,
								cinfo.output_scanline-1);

		}

	}

	/* Step 7: Finish decompression */

	(void) jpeg_finish_decompress(&cinfo);
	/* We can ignore the return value since suspension is not possible
	* with the stdio data source.
	*/

	/* Step 8: Release JPEG decompression object */

	/* This is an important step since it will release a good deal of memory. */
	jpeg_destroy_decompress(&cinfo);

	/* After finish_decompress, we can close the input file.
	* Here we postpone it until after no more JPEG errors are possible,
	* so as to simplify the setjmp error logic above.  (Actually, I don't
	* think that jpeg_destroy can do an error exit, but why assume anything...)
	*/
	fclose(infile);

	/* At this point you may want to check to see whether any corrupt-data
	* warnings occurred (test whether jerr.pub.num_warnings is nonzero).
	*/

	return dataBuf;
}

//
//	write a JPEG file
//
BOOL  WriteJPEGFile(LPCSTR lpstrFileName, 
						BYTE *dataBuf,
						UINT widthPix,
						UINT height,
						BOOL color, 
						int quality)
{
	if (dataBuf==NULL)
		return FALSE;
	if (widthPix==0)
		return FALSE;
	if (height==0)
		return FALSE;

	LPBYTE tmp;
	if (!color) 
	{
		tmp = (BYTE*)new BYTE[widthPix*height];
		if (tmp==NULL) 
		{
//			strJPEGErrorA = "Memory error";
			return FALSE;
		}

		UINT row,col;
		for (row=0;row<height;row++) 
		{
			for (col=0;col<widthPix;col++) 
			{
				LPBYTE pRed, pGrn, pBlu;
				pRed = dataBuf + row * widthPix * 3 + col * 3;
				pGrn = dataBuf + row * widthPix * 3 + col * 3 + 1;
				pBlu = dataBuf + row * widthPix * 3 + col * 3 + 2;

				// luminance
				int lum = (int)(.299 * (double)(*pRed) + .587 * (double)(*pGrn) + .114 * (double)(*pBlu));
				LPBYTE pGray;
				pGray = tmp + row * widthPix + col;
				*pGray = (BYTE)lum;
			}
		}
	}

	struct jpeg_compress_struct cinfo;
	/* More stuff */
	FILE * outfile;			/* target file */
	int row_stride;			/* physical row widthPix in image buffer */

	struct my_error_mgr jerr;

	/* Step 1: allocate and initialize JPEG compression object */
	cinfo.err = jpeg_std_error(&jerr.pub);
	jerr.pub.error_exit = my_error_exit;

	/* Establish the setjmp return context for my_error_exit to use. */
	if (setjmp(jerr.setjmp_buffer)) 
	{
		/* If we get here, the JPEG code has signaled an error.
		 * We need to clean up the JPEG object, close the input file, and return.
		 */

		jpeg_destroy_compress(&cinfo);
		fclose(outfile);

		if (!color) 
		{
			delete [] tmp;
		}
		return FALSE;
	}

	/* Now we can initialize the JPEG compression object. */
	jpeg_create_compress(&cinfo);

	/* Step 2: specify data destination (eg, a file) */
	/* Note: steps 2 and 3 can be done in either order. */

	if ((outfile = fopen(lpstrFileName, "wb")) == NULL) 
	{
		char buf[250];
		sprintf(buf, "JpegFile :\nCan't open %s\n", lpstrFileName);
//		strJPEGErrorA = buf;
		return FALSE;
	}

	jpeg_stdio_dest(&cinfo, outfile);

	/* Step 3: set parameters for compression */
												    
	/* First we supply a description of the input image.
	* Four fields of the cinfo struct must be filled in:
	*/
	cinfo.image_width = widthPix; 	/* image widthPix and height, in pixels */
	cinfo.image_height = height;
	if (color) 
	{
		cinfo.input_components = 3;		/* # of color components per pixel */
		cinfo.in_color_space = JCS_RGB; 	/* colorspace of input image */
	} 
	else 
	{
		cinfo.input_components = 1;		/* # of color components per pixel */
		cinfo.in_color_space = JCS_GRAYSCALE; 	/* colorspace of input image */
	}

 
/* Now use the library's routine to set default compression parameters.
   * (You must set at least cinfo.in_color_space before calling this,
   * since the defaults depend on the source color space.)
   */

  jpeg_set_defaults(&cinfo);
  /* Now you can set any non-default parameters you wish to.
   * Here we just illustrate the use of quality (quantization table) scaling:
   */
  jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */);

  /* Step 4: Start compressor */

  /* TRUE ensures that we will write a complete interchange-JPEG file.
   * Pass TRUE unless you are very sure of what you're doing.
   */
  jpeg_start_compress(&cinfo, TRUE);

  /* Step 5: while (scan lines remain to be written) */
  /*           jpeg_write_scanlines(...); */

  /* Here we use the library's state variable cinfo.next_scanline as the
   * loop counter, so that we don't have to keep track ourselves.
   * To keep things simple, we pass one scanline per call; you can pass
   * more if you wish, though.
   */
  row_stride = widthPix * 3;	/* JSAMPLEs per row in image_buffer */

  while (cinfo.next_scanline < cinfo.image_height) 
  {
    /* jpeg_write_scanlines expects an array of pointers to scanlines.
     * Here the array is only one element long, but you could pass
     * more than one scanline at a time if that's more convenient.
     */
	LPBYTE outRow;
	if (color) 
	{
		outRow = dataBuf + (cinfo.next_scanline * widthPix * 3);
	} 
	else 
	{
		outRow = tmp + (cinfo.next_scanline * widthPix);
	}

    (void) jpeg_write_scanlines(&cinfo, &outRow, 1);
  }

  /* Step 6: Finish compression */

  jpeg_finish_compress(&cinfo);

  /* After finish_compress, we can close the output file. */
  fclose(outfile);

  /* Step 7: release JPEG compression object */

  /* This is an important step since it will release a good deal of memory. */
  jpeg_destroy_compress(&cinfo);

  if (!color)
	  delete [] tmp;
  /* And we're done! */

  return TRUE;
}

void FreeBuffer(BYTE *Buffer)
{
	delete[] Buffer;
}

void j_putRGBScanline(BYTE *jpegline, 
					 int widthPix,
					 BYTE *outBuf,
					 int row)
{
 	BYTE	*buf;

 	buf=outBuf + 3*widthPix*row;
   	memcpy(buf,jpegline,3*widthPix);
}

void j_putGrayScanlineToRGB(BYTE *jpegline, 
							 int widthPix,
							 BYTE *outBuf,
							 int row)
{
	int		offset = 3 * widthPix * row;
 	int		count,i;
	BYTE	*buf1,*buf2;
	BYTE	iGray;

	buf1=jpegline+widthPix-1;
	buf2=outBuf+offset+3*(widthPix-1);
	for (count=0;count<widthPix;count++) 
	{
 		iGray=(*buf1--);
		for (i=0;i<3;i++) buf2[i]=iGray;
		buf2-=3;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美区自拍先锋| 床上的激情91.| 欧美精品aⅴ在线视频| 亚洲韩国精品一区| 欧美三级电影网站| 视频一区国产视频| 久久免费视频一区| 成人av片在线观看| 亚洲无人区一区| 欧美成人vps| 成人午夜免费电影| 亚洲永久精品国产| 精品国产青草久久久久福利| 国产精品中文字幕日韩精品 | 成人av免费网站| 亚洲激情图片qvod| 在线观看91av| 丁香网亚洲国际| 亚洲尤物视频在线| 久久久久国产成人精品亚洲午夜| aaa亚洲精品一二三区| 亚洲大片免费看| 国产日韩欧美a| 色噜噜狠狠一区二区三区果冻| 日韩va欧美va亚洲va久久| 久久久久久一级片| 欧美色图12p| 国产不卡视频在线播放| 夜夜精品浪潮av一区二区三区| 日韩欧美一区二区不卡| 99精品视频一区| 久久99国产精品免费| 中文字幕一区二区三区在线观看| 欧洲精品在线观看| 国产毛片精品视频| 午夜精品国产更新| 国产情人综合久久777777| 欧美色大人视频| 99精品国产视频| 久久国产精品99久久久久久老狼| 国产精品护士白丝一区av| 日韩欧美国产成人一区二区| 一本到三区不卡视频| 国产一区美女在线| 午夜久久福利影院| 亚洲人成网站影音先锋播放| www一区二区| 在线成人午夜影院| 91黄色小视频| www.欧美亚洲| 国产福利一区二区三区| 久久国产人妖系列| 天堂av在线一区| 亚洲综合视频在线| 亚洲男人天堂av网| 亚洲国产高清在线| 久久午夜电影网| 欧美一区二区视频在线观看| 欧美中文一区二区三区| 97se亚洲国产综合自在线| 国产成人亚洲综合a∨猫咪| 蜜臀av性久久久久蜜臀aⅴ | 精品一区二区三区视频| 午夜久久久久久| 亚洲h动漫在线| 1区2区3区精品视频| 欧美激情中文不卡| 国产亚洲精品中文字幕| wwwwww.欧美系列| 337p日本欧洲亚洲大胆精品| 日韩欧美国产综合一区 | 欧美在线播放高清精品| 色视频一区二区| 色噜噜狠狠色综合中国| 色婷婷综合视频在线观看| av在线这里只有精品| 99精品国产91久久久久久| 97久久精品人人做人人爽50路 | 色综合久久久久综合体桃花网| 成人少妇影院yyyy| 成人涩涩免费视频| gogogo免费视频观看亚洲一| 99久久精品99国产精品| 91蜜桃在线观看| 欧美午夜在线一二页| 欧美久久一二三四区| 日韩一本二本av| 久久女同精品一区二区| 国产亚洲一二三区| 中文字幕一区二区三区在线不卡| 亚洲免费看黄网站| 亚洲成人激情av| 男人操女人的视频在线观看欧美| 久久精品国产77777蜜臀| 久久成人综合网| 国产sm精品调教视频网站| 9i看片成人免费高清| 欧洲另类一二三四区| 欧美一区二区三区人| 久久久不卡网国产精品二区| 亚洲国产高清在线| 亚洲图片一区二区| 激情五月婷婷综合网| 99久久99久久精品免费观看| 欧美三级资源在线| 久久久久久久综合狠狠综合| 亚洲视频在线一区二区| 五月激情六月综合| 国产精品99久久久久久有的能看| 99视频在线观看一区三区| 欧美三级日本三级少妇99| 亚洲精品一区二区三区精华液| 亚洲欧美在线高清| 日本中文字幕一区| 成人短视频下载| 欧美精品在线观看播放| 久久久99久久| 天天色 色综合| 丰满少妇久久久久久久| 欧美日韩aaaaa| 国产丝袜欧美中文另类| 亚洲综合色噜噜狠狠| 狠狠网亚洲精品| 色婷婷一区二区三区四区| 日韩免费观看高清完整版在线观看| 欧美高清在线视频| 天天亚洲美女在线视频| 国产91丝袜在线播放| 欧美久久一二三四区| 日韩理论在线观看| 精品一区二区三区在线观看国产| 91免费观看视频在线| 久久人人97超碰com| 肉丝袜脚交视频一区二区| 成人h动漫精品一区二| 日韩限制级电影在线观看| 亚洲免费在线视频| 国产成人在线观看免费网站| 在线不卡免费欧美| 亚洲黄色小视频| 成人av小说网| 国产亚洲午夜高清国产拍精品| 日日嗨av一区二区三区四区| av中文字幕在线不卡| 国产亲近乱来精品视频| 六月丁香婷婷久久| 欧美精品1区2区3区| 一区二区免费在线| eeuss鲁片一区二区三区| 久久久亚洲国产美女国产盗摄 | 国产精品 欧美精品| 7777女厕盗摄久久久| 夜夜嗨av一区二区三区中文字幕 | 久久精品99国产精品| 欧美色网站导航| 一区二区三区四区五区视频在线观看| 国产一区二区三区久久久| 精品三级在线观看| 美女诱惑一区二区| 欧美一区二区免费视频| 日韩黄色小视频| 在线成人午夜影院| 日韩精品欧美成人高清一区二区| 欧美综合天天夜夜久久| 一区二区三区丝袜| 91麻豆免费观看| 亚洲欧美另类久久久精品2019| 成人福利在线看| 成人欧美一区二区三区| 91丝袜高跟美女视频| 亚洲欧美电影一区二区| 91网站在线观看视频| 亚洲私人黄色宅男| 欧洲亚洲国产日韩| 婷婷激情综合网| 亚洲精品在线观看网站| 国产麻豆9l精品三级站| 国产午夜精品久久久久久久| 国产成人精品亚洲午夜麻豆| 中文字幕av不卡| 99精品久久免费看蜜臀剧情介绍| 1024成人网| 欧美日韩视频在线观看一区二区三区 | 日韩毛片一二三区| 欧美三级电影精品| 久久国产精品无码网站| 国产精品视频在线看| 91久久久免费一区二区| 日韩电影在线免费观看| 欧美不卡在线视频| www.欧美日韩国产在线| 亚洲国产欧美在线人成| 日韩亚洲欧美在线| 成人久久18免费网站麻豆| 亚洲欧美国产77777| 欧美一区二区三区的| 国产成人综合在线观看| 亚洲图片你懂的| 91精品国产一区二区人妖| 国产精品一级黄|