zoukankan      html  css  js  c++  java
  • Agg:PPM格式图像生成

    PPM是一个Linux下的简单图像格式,可以用Xnview打开。Agg的教程第一个,就是生成PPM格式的图像。PPM格式定义参见:http://en.wikipedia.org/wiki/Netpbm_format。以下是一个简单的画点程序:

    buffer.cpp

    #include <stdio.h>
    #include <string.h>
    #include "agg_rendering_buffer.h"
    
    const int HEIGHT = 480;
    const int WIDTH = 640;
    
    /* PPM(Portable PixMap)
     * Portable BitMap    [1]    P1    ASCII    P4    binary    .pbm    0–1 (black & white)
     * Portable GrayMap    [2]    P2    ASCII    P5    binary    .pgm    0–255 (gray scale)
     * Portable PixMap    [3]    P3    ASCII    P6    binary    .ppm    0–255 (RGB)
     *
     * Row 0:R G B R G B ...
     * Row 1:R G B R G B ...
     * ...
     */ 
    bool writePpm(const unsigned char* buffer,
            unsigned width,
            unsigned height,
            const char* fileName)
    {
        FILE* fd = fopen(fileName, "wb");
        if(fd)
        {
            fprintf(fd, "P6 %d %d 255 ", width, height);
            fwrite(buffer, 1, width * height * 3, fd);
            fclose(fd);
            return true;
        }
        return false;
    }
    
    bool setPixel(agg::rendering_buffer& rbuf,
            int x,
            int y,
            unsigned char r,
            unsigned char g, 
            unsigned char b)
    {
        unsigned char* ptr = rbuf.row_ptr(y) + x * 3;
        *ptr++ = r;
        *ptr++ = g;
        *ptr++ = b;
        return true;
    }
    
    int main(int argc, char* argv[])
    {
        unsigned char* buffer = new unsigned char[WIDTH * HEIGHT * 3];
    
        memset(buffer, 255, WIDTH * HEIGHT * 3);
    
        agg::rendering_buffer rbuf(buffer, 
                WIDTH, 
                HEIGHT, 
                WIDTH * 3);
    
        for(int i = 0; i < WIDTH; i ++)
        {
            setPixel(rbuf, i, 10, 255, 0, 0);
        }    
        for(int i = 0; i < HEIGHT; i ++)
        {
            setPixel(rbuf, 120, i, 0, 255, 0);
        }
        writePpm(buffer, WIDTH, HEIGHT, "agg_test.ppm");
    
        delete [] buffer;
        return 0;
    }

    Makefile:

    OBJS = buffer.cpp 
    #agg_win32_bmp.cpp agg_platform_support.cpp
    
    CC = g++
    COMPILER_FLAGS = -w -m32
    LINKER_FLAGS = -lagg -lgdi32
    
    HEADERS = -I./agg/include
    LIBS = -L./agg/lib 
    
    OBJ_NAME = agg.exe
    
    all    :$(OBJS)
        $(CC) $(OBJS) $(COMPILER_FLAGS) $(HEADERS) $(LIBS) $(LINKER_FLAGS) -o $(OBJ_NAME)
    
    clean:
        rm -f *.o *.exe

    画出来很简单:

  • 相关阅读:
    linux命令:ls
    linux 进程线程拓展
    linux命令:find
    电动车充电器原理及带电路图维修
    kmalloc分配物理内存与高端内存映射--Linux内存管理(十八)
    Linux内核最新的连续内存分配器(CMA)——避免预留大块内存【转】
    alloc_page分配内存空间--Linux内存管理(十七)
    伙伴系统之避免碎片--Linux内存管理(十六)
    伙伴系统之伙伴系统概述--Linux内存管理(十五)
    USB初学(一)---USB-HID的初步认识【转】
  • 原文地址:https://www.cnblogs.com/jpeg/p/draw-ppm-image.html
Copyright © 2011-2022 走看看