GD を使ってみる

結局 Imlib2ではメモリに展開された、ポインタを渡しての処理ができそうになかったので、GDを使ってみる (Imlib2については/log/2011-07-20 )

インストール

yum install dg-devel

関数を調べる

  • リサイズとかの時にいい品質の画像(領域?)を得る。
    gdImageCreateTrueColor(sx, sy) (FUNCTION) 
cf:gdImageCreate(sx, sy) (FUNCTION) 
//gdImageCreateは256カラーなので良くない
//gdImageCreate is called to create palette-based images, with no more than 256 colors.
  • ポインタからイメージをつくる
    gdImageCreateFromJpegPtr(int size, void *data) (FUNCTION) 
  • イメージを指してるポインタからファイルに書き出す
    void gdImageJpeg(gdImagePtr im, FILE *out, int quality) (FUNCTION)
    //quality should be a value in the range 0-95
  • リサイズを綺麗にしてくれる
    void gdImageCopyResampled(gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int srcX, int srcY, int destW, int destH, int srcW, int srcH) (FUNCTION)
    
    下のgdImageCopyResized関数より効果が高い
  • リサイズしてくれる (inとoutのgdImagePtr?が必要)
    void gdImageCopyResized(gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int srcX, int srcY, int destW, int destH, int srcW, int srcH) (FUNCTION)

サンプル

このサイトの抜粋:gd basics: using gd in your program http://www.boutell.com/gd/manual2.0.33.html#basics

  • コンパイル
    gcc gd_test.c -lgd -lpng -lz -ljpeg -lfreetype -lm
  • コード
		/* Bring in gd library functions */
		#include "gd.h"
	
		/* Bring in standard I/O so we can output the PNG to a file */
		#include <stdio.h>
	
		int main() {
		  /* Declare the image */
		  gdImagePtr im;
		  /* Declare output files */
		  FILE *pngout, *jpegout;
		  /* Declare color indexes */
		  int black;
		  int white;
	
		  /* Allocate the image: 64 pixels across by 64 pixels tall */
		  im = gdImageCreate(64, 64);
	
		  /* Allocate the color black (red, green and blue all minimum).
			Since this is the first color in a new image, it will
			be the background color. */
		  black = gdImageColorAllocate(im, 0, 0, 0);  
	
		  /* Allocate the color white (red, green and blue all maximum). */
		  white = gdImageColorAllocate(im, 255, 255, 255);  
		  
		  /* Draw a line from the upper left to the lower right,
			using white color index. */
		  gdImageLine(im, 0, 0, 63, 63, white);  
	
		  /* Open a file for writing. "wb" means "write binary", important
			under MSDOS, harmless under Unix. */
		  pngout = fopen("test.png", "wb");
	
		  /* Do the same for a JPEG-format file. */
		  jpegout = fopen("test.jpg", "wb");
	
		  /* Output the image to the disk file in PNG format. */
		  gdImagePng(im, pngout);
	
		  /* Output the same image in JPEG format, using the default
			JPEG quality setting. */
		  gdImageJpeg(im, jpegout, -1);
	
		  /* Close the files. */
		  fclose(pngout);
		  fclose(jpegout);
	
		  /* Destroy the image in memory. */
		  gdImageDestroy(im);
		}

リサイズ サンプル char*を渡して使う方法

	#include <unistd.h>
	#include <stdio.h>
	#include "gd.h"
	
	//usage: #./a.out < xxx.jpg
	void test_copy(gdImagePtr im_in)
	{
		FILE *out;
		gdImagePtr im_out;
		int x,y;
	
	
		/* Make the output image four times as large on both axes */
		im_out = gdImageCreateTrueColor(500, 333);
		/* Now tile the larger image using the smaller one */
		gdImageCopyResampled(im_out, im_in,
				0,0,0,0,
				im_out->sx,im_out->sy,
				im_in->sx, im_in->sy);
	
		out = fopen("resized.jpg", "wb");
		gdImageJpeg(im_out, out,95);
		fclose(out);
		gdImageDestroy(im_out);
	}
	int main()
	{
		//char buffer[1024];
		char buffer[500000]; //500kb
		int nread;
		while(nread = read(0,buffer,500000))
		{
			printf("read byte %d\n",nread);
			gdImagePtr im;
			im = gdImageCreateFromJpegPtr(nread,buffer);
	
			FILE *jpegout;
	
			jpegout = fopen("ptr.jpg", "wb");
	
	
			/* Output the same image in JPEG format, using the default
			JPEG quality setting. */
			gdImageJpeg(im, jpegout, -1);
	
			/* Close the files. */
			fclose(jpegout);
			test_copy(im);
			gdImageDestroy(im);
		}
	}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-08-02 (火) 11:18:23 (2879d)