I think there’s still some confusion:
As above, media_data has to be Base64 encoded image data, not a URL.
segment_index starts with 0.
Also i think another source of error is in Postman, inconsistently specifying parameters as URL parameters instead of form data and not specifying this in the request settings. Try to set parameters in Body in postman, and specify multipart/form-data when uploading media, to stay consistent.
I was able to successfully DM the image, specifying all the parameters in the docs.
For all of these requests, the Authorization is set to oAuth1.0 Request Headers, as:
Initialize the upload: POST media/upload (INIT) | Docs | Twitter Developer Platform
Note the size in bytes you specified is different for the dog picture - this may or may not be due to re-saving it from the forum, so double check that too.
Append the image data, POST media/upload (APPEND) | Docs | Twitter Developer Platform this is the image file encoded into base64, it should look like this (... is a bunch more base64 data):
/9j/4AAQSk...Jw1saJSmT//Z
The result is 204, No Content.
Then Finalize the upload: POST media/upload (FINALIZE) | Docs | Twitter Developer Platform
Now, again using oAuth1.0, but this time with v2 API to send a DM: POST /2/dm_conversations/with/:participant_id/messages | Docs | Twitter Developer Platform
Note: This request has both Params and a Body, So make sure to set the recipient user ID as participant_id in Params:

The body has the uploaded DM image ID as an attachment:
{
"text": "Sending a DM with media!",
"attachments": [
{
"media_id": "1625498642814730242"
}
]
}
The DM is successfully posted:
