You can collect image attributes using “wp_get_attachment_metadata“, see below example as starting point
function mytheme_post_thumbnail( $size="post-thumbnail", $attr="", $post_id = null ) {
if ( has_post_thumbnail( $post_id ) ) {
$meta = wp_get_attachment_metadata( get_post_thumbnail_id( $post_id ) );
$args['width'] = $meta['sizes'][$size]['width'];
$args['height'] = $meta['sizes'][$size]['height'];
$args['alt'] = isset( $attr['alt'] ) ? $attr['alt'] : apply_filters( 'post_title', get_post( $post_id )->post_title );
$args['title'] = isset( $attr['title'] ) ? $attr['title'] : apply_filters( 'post_title', get_post( $post_id )->post_title );
$args['class'] = isset( $attr['class'] ) ? $attr['class'] : '';
$thumbnail = wp_get_attachment_image( get_post_thumbnail_id( $post_id ), $size, false, $args);
echo $thumbnail;
} else {
printf( '<img src="https://wordpress.stackexchange.com/questions/174019/%1$s/images/default-thumb.png" alt="%2$s" />', get_template_directory_uri(), the_title_attribute( [ 'echo' => false ] ) );
}
}