Substantial work has also gone into improving the documentation. In particular:

The Advanced Recipes chapter has been thoroughly re-worked and I would
encourage anyone using the camera for Computer Vision purposes to re-read
that chapter

The Camera Hardware chapter has been extended to include a thorough introduction
to the low level operation of the camera module. This is important for
understanding the limitations and peculiarities of the system

Anyone interested in using a lower level API to control the camera (which
includes capabilities like manipulating frames before they hit the video
encoder) should read the API - mmalobj chapter

Finally, some work was done on enhancing the PDF and EPub versions of the
documentation. These should now be much more useable in hard-copy and on
e-readers

Fixed several Python 3 bytes/unicode issues that were related to #297 (I’d
erroneously run the picamera test suite twice against Python 2 instead of 2
and 3 when releasing 1.11, which is how these snuck in)

Prevent setting attributes on the main PiCamera class to ease
debugging in educational settings (#240)

Due to the core re-writes in this version, you may require cutting edge
firmware (sudorpi-update) if you are performing unencoded captures,
unencoded video recording, motion estimation vector sampling, or manual
sensor mode setting.

Added property to control preview’s resolution
separately from the camera’s resolution (required for
maximum resolution previews on the V2 module - #296).

The major enhancement is the addition of support for the camera’s flash
driver. This is relatively complex to configure, but a full recipe has been
included in the documentation (#184)

A new intra_refresh attribute is added to the
start_recording() method permitting control of the
intra-frame refresh method (#193)

The GPIO pins controlling the camera’s LED are now configurable. This is
mainly for any compute module users, but also for anyone who wishes to use
the device tree blob to reconfigure the pins used (#198)

The new annotate V3 struct is now supported, providing custom background
colors for annotations, and configurable text size. As part of this work a
new Color class was introduced for representation and manipulation
of colors (#203)

Reverse enumeration of frames in PiCameraCircularIO is now supported
efficiently (without having to convert frames to a list first) (#204)

Finally, the API documentation has been re-worked as it was getting too
large to comfortably load on all platforms (no ticket)

The camera’s sensor mode can now be forced to a particular setting upon
camera initialization with the new sensor_mode parameter to
PiCamera (#165)

The camera’s initial framerate and resolution can also be specified as
keyword arguments to the PiCamera initializer. This is primarily
intended to reduce initialization time (#180)

Added the still_stats attribute which controls
whether an extra statistics pass is made when capturing images from the still
port (#166)

Fixed the led attribute so it should now work on
the Raspberry Pi model B+ (#170)

Fixed a nasty memory leak in overlay renderers which caused the camera to run
out of memory when overlays were repeatedly created and destroyed (#174) *
Fixed a long standing issue with MJPEG recording which caused camera lockups
when resolutions greater than VGA were used (#47 and #179)

Fixed a bug with incorrect frame metadata in PiCameraCircularIO.
Unfortunately this required breaking backwards compatibility to some extent.
If you use this class and rely on the frame metadata, please familiarize
yourself with the new complete attribute (#177)

A new chapter on detecting and correcting deprecated functionality was added
to the docs (#149)

Stereoscopic cameras are now tentatively supported on the Pi compute module.
Please note I have no hardware for testing this, so the implementation is
possibly (probably!) wrong; bug reports welcome! (#153)

Text annotation functionality has been extended; up to 255 characters are now
possible, and the new annotate_frame_num attribute adds
rendering of the current frame number. In addition, the new
annotate_background flag permits a dark background to be
rendered behind all annotations for contrast (#160)

Arbitrary image overlays can now be drawn on the preview using the new
add_overlay() method. A new recipe has been included
demonstrating overlays from PIL images and numpy arrays. As part of this work
the preview system was substantially changed; all older scripts should
continue to work but please be aware that most preview attributes are now
deprecated; the new preview attribute replaces them
(#144)

A bug in the handling of framerates meant that long exposures (>1s) weren’t
operating correctly. This should be fixed, but I’d be grateful if users
could test this and let me know for certain (Exif metadata reports the
configured exposure speed so it can’t be used to determine if things are
actually working) (#135)

A bug in 1.7 broke compatibility with older firmwares (resulting in an error
message mentioning “mmal_queue_timedwait”). The library should now on older
firmwares (#154)

Finally, the confusingly named crop attribute was changed
to a deprecated alias for the new zoom attribute (#146)

The awb_gains attribute is no longer write-only; you can
now read it to determine the red/blue balance that the camera is using
(#98)

The new read-only exposure_speed attribute will tell you
the shutter speed the camera’s auto-exposure has determined, or the shutter
speed you’ve forced with a non-zero value of shutter_speed
(#98)

The new read-only analog_gain and
digital_gain attributes can be used to determine the amount
of gain the camera is applying at a couple of crucial points of the image
processing pipeline (#98)

The new drc_strength attribute can be used to query and set
the amount of dynamic range compression the camera will apply to its output
(#110)

The intra_period parameter for start_recording() can now be
set to 0 (which means “produce one initial I-frame, then just P-frames”)
(#117)

The burst parameter was added to the various capture()
methods; users are strongly advised to read the cautions in the docs before
relying on this parameter (#115)

One of the advanced recipes in the manual (“splitting to/from a circular
stream”) failed under 1.5 due to a lack of splitter-port support in the
circular I/O stream class. This has now been rectified by adding a
splitter_port parameter to the constructor of PiCameraCircularIO
(#109)

Similarly, the arrayextensions introduced in 1.5
failed to work when resizers were present in the pipeline. This has been
fixed by adding a size parameter to the constructor of all the custom
output classes defined in that module (#121)

A bug that caused picamera to fail when the display was disabled has been
squashed (#120)

As always, many thanks to the community for another great set of bug reports!

1.5 fixed several bugs and introduced a couple of major new pieces of
functionality:

The new picamera.array module provides a series of custom output
classes which can be used to easily obtain numpy arrays from a variety of
sources (#107)

The motion_output parameter was added to start_recording()
to enable output of motion vector data generated by the H.264 encoder. A
couple of new recipes were added to the documentation to demonstrate this
(#94)

The ability to construct custom encoders was added, including some examples
in the documentation. Many thanks to user Oleksandr Sviridenko (d2rk) for
helping with the design of this feature! (#97)

An example recipe was added to the documentation covering loading and
conversion of raw Bayer data (#95)

Speed of unencoded RGB and BGR captures was substantially improved in both
Python 2 and 3 with a little optimization work. The warning about using
alpha-inclusive modes like RGBA has been removed as a result (#103)

An issue with out-of-order calls to stop_recording() when
multiple recordings were active was resolved (#105)

Finally, picamera caught up with raspistill and raspivid by offering a
friendly error message when used with a disabled camera - thanks to Andrew
Scheller (lurch) for the suggestion! (#89)

A bug which caused picamera to fail when used in UNIX-style daemons, unless
the module was imported after the double-fork to background was fixed
(#85)

A bug which caused the frame attribute to fail when queried
in Python 3 was fixed (#80)

A bug which caused raw captures with “odd” resolutions (like 100x100) to
fail was fixed (#83)

Known issues:

Added a workaround for full-resolution YUV captures failing. This
isn’t a complete fix, and attempting to capture a JPEG before attempting to
capture full-resolution YUV data will still fail, unless the GPU memory split
is set to something huge like 256Mb (#73)

Many thanks to the community for yet more excellent quality bug reports!

The new frame attribute permits querying information about
the frame last written to the output stream (number, timestamp, size,
keyframe, etc.) (#34, #36)

All capture methods (capture() et al), and the
start_recording() method now accept a resize parameter
which invokes a resizer prior to the encoding step (#21)

A new PiCameraCircularIO stream class is provided to permit holding
the last n seconds of video in memory, ready for writing out to disk (or
whatever you like) (#39)

There’s a new way to specify raw captures - simply use the format you require
with the capture method of your choice. As a result of this, the
raw_format attribute is now deprecated (#32)

Some bugs were also fixed:

GPIO.cleanup is no longer called on close() (#35), and
GPIO set up is only done on first use of the led attribute
which should resolve issues that users have been having with using picamera
in conjunction with GPIO

Raw RGB video-port based image captures are now working again too (#32)

Capture of images whilst recording without frame-drop. Previously, images
could be captured whilst recording but only from the still port which
resulted in dropped frames in the recorded video due to the mode switch. In
0.8, use_video_port=True can be specified on capture methods whilst
recording video to avoid this.

Splitting of video recordings into multiple files. This is done via the new
split_recording() method, and requires that the
start_recording() method was called with inline_headers set
to True. The latter has now been made the default (technically this is a
backwards incompatible change, but it’s relatively trivial and I don’t
anticipate anyone’s code breaking because of this change).

In addition a few bugs were fixed:

Documentation updates that were missing from 0.7 (specifically the new
video recording parameters)

The ability to perform raw captures through the video port

Missing exception imports in the encoders module (which caused very confusing
errors in the case that an exception was raised within an encoder thread)

The issue of captures fading to black over time when the preview is not
running has been resolved. This solution was to permanently activate the
preview, but pipe it to a null-sink when not required. Note that this means
rapid capture gets even slower when not using the video port

LED support is via RPi.GPIO only; the RPIO library simply doesn’t support it
at this time

The major change in 0.3 was the introduction of custom Exif tagging for
captured images, and fixing a silly bug which prevented more than one image
being captured during the lifetime of a PiCamera instance.