>>402
image06がグラデーション入りの微妙に白じゃないデータなので合成のしかたは乗算にした。
多分だいたい題意は満たす。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char*getline(char buf[],int size,FILE*fp){char*p;while( (p=fgets(buf,size,fp)) != NULL && *p=='#'){}return p;}
typedef struct{int width;int height;unsigned char*vram;}Image;
Image load(char*filename){
    Image p;FILE*fp = fopen(filename,"rb");char buf[512];getline(buf,sizeof(buf),fp);
    getline(buf,sizeof(buf),fp);sscanf(buf,"%d%d",&p.width,&p.height);
    getline(buf,sizeof(buf),fp);fread(p.vram = malloc(p.width*p.height*3),p.width*3,p.height,fp);
    fclose(fp);return p;}
void save(char*filename,Image img){
    FILE*fp=fopen(filename,"wb");fprintf(fp,"P6\n%d %d\n%d\n",img.width,img.height,255);
    fwrite(img.vram,img.width*3,img.height,fp);fclose(fp);}
int main(){
    Image i02 = load("image02.ppm"),i06 = load("image06.ppm");
    int y,x;
    for(y=0;y<i06.height;++y)for(x=0;x<i06.width*3;++x)i02.vram[(y+150)*i02.width*3 + x+100*3] =
        i02.vram[(y+150)*i02.width*3 + x+100*3] * i06.vram[y*i06.width*3 + x] / 255;
    save("out.ppm",i02);return 0;}