-- Minor native-pixel cleanup of an ImageGen expression variant. -- Preserve the neutral portrait's hair, clothing, jaw and alpha silhouette. -- Copy only generated brows/eyes and mouth, with no scaling or warping. local neutral=app.open(app.params.neutral) local out=Image(neutral.cels[1].image) neutral:close() local variant=app.open(app.params.variant) local face=Image(variant.cels[1].image) assert(out.width==160 and out.height==192 and face.width==160 and face.height==192) local regions={{81,64,46,24},{95,98,22,14}} if app.params.regions then regions={} for x,y,w,h in app.params.regions:gmatch('(%d+),(%d+),(%d+),(%d+)') do table.insert(regions,{tonumber(x),tonumber(y),tonumber(w),tonumber(h)}) end assert(#regions>0, 'Provide x,y,width,height rectangles') end for _,box in ipairs(regions) do for y=box[2],box[2]+box[4]-1 do for x=box[1],box[1]+box[3]-1 do if app.pixelColor.rgbaA(out:getPixel(x,y))==255 and app.pixelColor.rgbaA(face:getPixel(x,y))==255 then out:drawPixel(x,y,face:getPixel(x,y)) end end end end variant:close() local result=Sprite(160,192,ColorMode.RGB) result.cels[1].image=out result:saveAs(app.params.output) result:close()