Hi!
Last question first, you can use PNGs without any libraries, there are many PNG decoders out there, like
http://lodev.org/lodepng/picopng.cpp (which I prefer, because of it's size).
Let's assume you have the image in RGBA Format uncompressed in memory, first of all you'll have to tell GL to generate a texture:
glGenTextures (1, &myTexture);
You'll have to bind the texture for the operations to follow:
glBindTexture (GL_TEXTURE_2D, myTexture);
And you'll have to describe to GL what size and format your image has (please take a look at the API Manual, there are many options!):
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, myTexture_width, myTexture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, uncompressedMemoryTexture);
If you have done any errors in your previous steps, you will notice it when calling glTexImage2D =).
We can change the filtering of our texture:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
After you've done all that, unbind any texture:
glBindTexture(GL_TEXTURE_2D, 0);
Somewhere in your code you have to enable the usage of textures:
glEnable(GL_TEXTURE_2D);
In your code where you do the rendering you'll have to pass a UV-Coordinate to every vertex you pass to the pipeline to tell GL how to map the image onto the vertex.
Imagine this:

and use glTexCoord2f(s,t) and pass the coordinates to gl.
Nehe has good examples for mapping:
http://nehe.gamedev.net/tutorial/texture_mapping/12038/Bye =).
Edit:
Transparency is very tricky to do right because you have to be very cautious to order your vertices from the most far to the closest one.
But a quick answer would be:
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);