I'm using random data for test input. If each image has 80 lines to be rendered with my code above, then I would generate it as:
i=Table[RandomReal[{0, 1}, 9], {i, 1, 80}]
render[i]//AbsoluteTiming
Your code is going to be faster as you wrote it because it isn't compositing the image from graphics primitives - it's going from a 2D array of numbers and creating a raster image from it. My code above is creating the Image from a set of Graphics primitives, not a 2D array of numbers. Adding ImageSize->{200,200} to my code doesn't change the performance in a useful way. In fact, changing render to:
render2[i_] := Image[Graphics[oneline[#, 0.5, 200] & /@ i], ImageSize -> {200, 200}]
Takes 7.3 seconds, where the original render[] takes 6.5 seconds on the same input.
pop = Table[Table[RandomReal[{0,1},9],{i,1,80}],{j,1,100}];
In[23]:= ((render /@ pop) // AbsoluteTiming)[[1]]
Out[23]= 6.52233
In[24]:= ((render2 /@ pop) // AbsoluteTiming)[[1]]
Out[24]= 7.26737