Making posts via Bluesky’s official interface will first transcode/compress your image to their preset JPEG within your browser, then upload that compressed file to the server.
To avoid this extra compression and instead have your file uploaded verbatim, one should call the com.atproto.repo.uploadBlob XRPC directly; there are third-party interfaces which wraps this in a nice and familiar UX flow.
I’ve personally found that https://atproto.at has the best usability for this use case of making uncompressed Bluesky posts.
Updated