Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include"abc.h"
- #include <stdlib.h>
- #define MAX_IMAGE_SIZE 512
- int AllocateImage(ImageData *img, int _w, int _h, int _channels){
- img->data = (unsigned char *)malloc(sizeof(unsigned char)*MAX_IMAGE_SIZE*MAX_IMAGE_SIZE*_channels);
- if(img->data==NULL){
- return 0;
- }
- img->w = _w;
- img->h = _h;
- img->chan = _channels;
- return 1;
- }
- void ReleaseImage(ImageData *img){
- free(img->data);
- }
- void CopyImage(ImageData *imgIn, ImageData *imgOut){
- int j;
- j = AllocateImage(imgOut, imgIn->w, imgIn->h, imgIn->chan);
- if(j==0) {
- printf("Error\n\n");
- }
- imgOut = imgIn;
- ReleaseImage(imgOut);
- }
- int LoadImage(const char *filename, ImageData *img){
- FILE *fp;
- char header[32];
- int _w, _h, _dummy;
- int is_binary = 0;
- fp = fopen(filename, "rb");
- if (fp == NULL)
- {
- fprintf(stderr, "Error: cannot open file: %s\n", filename);
- return 0;
- }
- fscanf(fp, "%s", header);
- if (img->chan==1){
- is_binary = (header[1] == '5');
- fscanf(fp, "%d %d\n", &_w, &_h);
- fscanf(fp, "%d¥n", &_dummy);
- if (_w <= 0 || _w >= MAX_IMAGE_SIZE || _h <= 0 || _h >= MAX_IMAGE_SIZE)
- {
- fprintf(stderr, "Error: invalid image size: %dx%d\n", _w, _h);
- fclose(fp);
- return 0;
- }
- if (is_binary)
- {
- int nExpectedBytes = sizeof(unsigned char) * _w * _h;
- int nRead = fread(img->data, sizeof(unsigned char), _w*_h, fp);
- if (nRead != nExpectedBytes)
- {
- fprintf(stderr, "Error: read data too little: %d\n",
- nRead);
- fclose(fp);
- return 0;
- }
- }
- else
- {
- int xi, yi;
- for (yi=0; yi<_h; yi++)
- {
- for (xi=0; xi<_w; xi++)
- {
- int gray;
- int idx = xi + _w * yi;
- fscanf(fp, "%d", &gray);
- img->data[idx] = gray;
- }
- }
- }
- fclose(fp);
- img->w = _w;
- img->h = _h;
- fprintf(stderr, "note: pgm image loaded: %s\n", filename);
- return 1;
- }else if (img->chan==3 ) {
- is_binary = (header[1] == '6');
- fscanf(fp, "%d %d¥n", &_w, &_h);
- fscanf(fp, "%d¥n", &_dummy);
- if (_w <= 0 || _w >= MAX_IMAGE_SIZE || _h <= 0 || _h >= MAX_IMAGE_SIZE)
- {
- fprintf(stderr, "Error: invalid image size: %dx%d\n", _w, _h);
- fclose(fp);
- return 0;
- }
- if (is_binary)
- {
- int nExpectedBytes = 3 * sizeof(unsigned char) * _w * _h;
- int nRead = fread(img->data, sizeof(unsigned char), 3*_w*_h, fp);
- if (nRead != nExpectedBytes)
- {
- fprintf(stderr, "Error: read data too little: %d\n",
- nRead);
- fclose(fp);
- return 0;
- }
- }
- else
- {
- int xi, yi;
- for (yi=0; yi<_h; yi++)
- {
- for (xi=0; xi<_w; xi++)
- {
- int r, g, b;
- int idx = 3 * (xi + _w * yi);
- fscanf(fp, "%d %d %d", &r, &g, &b);
- img->data[idx ] = r;
- img->data[idx+1] = g;
- img->data[idx+2] = b;
- }
- }
- }
- fclose(fp);
- return 1;
- }
- }
- int SaveImage(const char *filename, ImageData *img){
- if(img->chan==1){
- FILE *fp;
- int nExpectedBytes, nWritten;
- if (img->w <= 0 || img->w >= MAX_IMAGE_SIZE || img->h <= 0 || img->h >= MAX_IMAGE_SIZE)
- {
- fprintf(stderr, "Error: invalid image size: %dx%d\n", img->w, img->h);
- return 0;
- }
- fp = fopen(filename, "wb");
- if ( fp == NULL )
- {
- fprintf(stderr, "Error: cannot open file: %s\n", filename);
- return 0;
- }
- /* ヘッダを書き込み */
- fprintf(fp, "P5\n%d %d\n255\n", img->w, img->h);
- nExpectedBytes = sizeof(unsigned char) * img->w * img->h;
- /* バイナリデータを書き込み */
- nWritten = fwrite(img->data, sizeof(unsigned char), img->w*img->h, fp);
- if (nWritten != nExpectedBytes)
- {
- fprintf(stderr, "Error: written data too little: %d\n", nWritten);
- fclose(fp);
- return 0;
- }
- fclose(fp);
- fprintf(stderr, "note: pgm image saved: %s\n", filename);
- return 1;
- }else if(img->chan==3) {
- FILE *fp;
- int nExpectedBytes, nWritten;
- if (img->w <= 0 || img->w >= MAX_IMAGE_SIZE || img->h <= 0 || img->h >= MAX_IMAGE_SIZE)
- {
- fprintf(stderr, "Error: invalid image size: %dx%d\n", img->w, img->h);
- return 0;
- }
- fp = fopen(filename, "wb");
- if ( fp == NULL )
- {
- fprintf(stderr, "Error: cannot open file: %s\n", filename);
- return 0;
- }
- /* ヘッダを書き込み */
- fprintf(fp, "P6\n%d %d\n255\n", img->w, img->h);
- nExpectedBytes = 3 * sizeof(unsigned char) * img->w * img->h;
- /* バイナリデータを書き込み */
- nWritten = fwrite(img->data, sizeof(unsigned char), 3*img->w*img->h, fp);
- if (nWritten != nExpectedBytes)
- {
- fprintf(stderr, "Error: written data too little: %d\n", nWritten);
- fclose(fp);
- return 0;
- }
- fclose(fp);
- fprintf(stderr, "note: ppm image saved: %s\n", filename);
- return 1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement