in combination with linear filtering will produce that effect. The solution to that is to pre-multiply alpha, i.e. convert each texel from (r,g,b,a) to (a*r,a*g,a*b,a) and use
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Using pre-multiplied alpha gives the correct result when interpolating between opaque and transparent pixels.
As for the vertical green line: Is the entire image a single texture, or is it two copies of the texture, one mirrored? I.e. is the line in the middle of the texture or at the edge? If it’s the edge, try GL_CLAMP_TO_EDGE rather than GL_CLAMP.