Modifying protexted image sizes: use “add_image_size()” or “update_option()”?

There is little difference, by default crop is set to false.

function add_image_size( $name, $width = 0, $height = 0, $crop = false ) {
    global $_wp_additional_image_sizes;

    $_wp_additional_image_sizes[ $name ] = array(
        'width'  => absint( $width ),
        'height' => absint( $height ),
        'crop'   => $crop,
    );
}

And also during the process of evaluation

if ( isset( $_wp_additional_image_sizes[ $size ] ) ) {
                $width  = intval( $_wp_additional_image_sizes[ $size ]['width'] );
                $height = intval( $_wp_additional_image_sizes[ $size ]['height'] );
                $crop   = ( $nocrop ) ? false : $_wp_additional_image_sizes[ $size ]['crop'];
            } else {
                $height = get_option( "{$size}_size_h" );
                $width  = get_option( "{$size}_size_w" );
                $crop   = ( $nocrop ) ? false : get_option( "{$size}_crop" );
            }

variable $_wp_additional_image_sizes is took in consideration. Other then that it is very simple, options will be read from options table only if not defined.

Also please note: the database wp_options table is read before functions.php has been processed.