up flash and the hot shoe, which is compatible with many of Nikon’s optional Speedlight flashes.
Amid the multi-function flash button and the Fn button, a movie record button is also present on the top plate, sitting alongside the info button. On the back of the camera, one of the main differences in controls is that of the Lv button, which triggers Live View. This “Lv” control, however, does not distinguish between still image and movie Live View operation.
One of the very welcome differences compared to the D3100 is the D3200’s inclusion of an infrared remote receiver situated in the front of the handgrip and on the top rear left of the camera. This allows the camera to be remotely triggered using an optional infrared trigger, resulting in easy self-portrait or close-up shooting.
On the rear of the Nikon D3200 sits the 3-inch 921k-Dot LCD monitor, which provides a 160-degree viewing angle and approximately 100-percent frame coverage. This LCD monitor is especially useful for framing shots, Live View shooting, video playback, browsing through images, and more. Offering an overall clear view that allows for brightness adjustment to help users see it easily under any type of lighting, this LCD screen is a pleasure to work with.
Also included is a pentamirror optical viewfinder, which offers 95-percent coverage and a magnification level of.08x. Although the viewfinder is reasonably sized, meaning that it’s great to work with and compares well to its competition, there is that 5-percent gap in the frame coverage. The percentage lacking around the frame is minor and won’t be an issue in everyday photography, when it doesn’t matter if something creeping into the corner of the shot goes by unnoticed. But when the utmost precision must be achieved, instead use Live View for 100-percent frame coverage.
Equipped with a 24.2MP DX-format CMOS sensor and an EXPEED 3 image processor, the Nikon D3200 captures stunning RAW and JPEG images in high resolution. The superior image processor results in continuous shooting up to 4fps, a frame rate that is to be expected in this particular class of camera. The ISO range is 100 – 6400, expandable to 100 – 12800 — this range allows for the capture of quality images and video under various lighting conditions with minimal noise. Active D-Lighting is particularly useful in revealing detail in dark or light regions of high-contrast scenes.
The D3200’s autofocus system is satisfactory but not superior, providing only an 11-point system. That being said, the autofocus does lock focus reliably even on moving subjects, despite the lighting conditions. There are four AF-area modes for the user to choose from: face-priority AF, wide-area AF, normal-area AF, and subject-tracking AF. Keep in mind, however, that focusing in Live View is significantly slower than the standard phase detection system but still acceptable and perfectly usable.
One of the features that this Nikon D3200 review mustn’t neglect mentioning is its excellent video capability. For instance, enjoy shooting high-definition movies in Full HD 1920 x 1080p at 30 / 25 / 24p or 1280 x 720p at 60 / 50p in AVC format for ultra-smooth playback. Depending on the type of quality one is looking for, shooting is also available in 640 x 424 at 30 / 25p. Regardless of whether the D3200 is considered to be an entry-level model, this camera is perfect for capturing all kinds of video, thanks to its manual exposure control and full-time autofocus.
An input for an external microphone is also available if capturing the highest quality audio possible is desired. Another feature of note is the Nikon D3200’s Wi-Fi capabilities. Even though the optional WU-1a Wireless Mobile Adapter is required in order to activate the Wi-Fi functionality, it is an excellent feature to have. Instead of needing to wait to share that perfect shot with family and friends, simply transfer images over to your smartphone via the free app. Even utilize your phone for remote shutter release for still shooting.
The Nikon D3200 is priced at $499 for both the body and a NIKKOR 18-55mm lens. Two additional configurations are available: the deluxe kit for $649.95 and the dental kit for $1,322.50.
As you likely gathered from this Nikon D3200 review, this entry-level DSLR is an all-around satisfactory camera that can be used to tackle nearly any type of photography. Simply put, this is the perfect camera for anyone who wants the ability to take quality images. Although not necessarily groundbreaking, the D3200 doesn’t need to be. It just needs to prove that it is a solid performer that can keep up with those on the higher end.
Leave us a comment below about the Nikon D3200.import { HTML_CONTENT_BASE_PATH, HTML_CONTENT_EXT, MARKDOWN_CONTENT_BASE_PATH, MARKDOWN_CONTENT_EXT } from '../constants';
import {
	BooleanPropertyContract,
	ChoicePropertyContract,
	CollectionPropertyContract,
	ColorPropertyContract,
	DataContract,
	DateTimePropertyContract,
	HtmlPropertyContract,
	ImagePropertyContract,
	MarkdownPropertyContract,
	PropertyContract,
	PropertyContractMap,
	PropertyContractType,
	SectionContractMap,
	TextPropertyContract,
	ZoneContractMap
} from '../model';
import { ReadableStorage, WritableStorage } from '../storage';
import { dateToIsoString } from '../utils/date-utils';
import { generateFileName } from '../utils/file-name-generator';

export class DataActivator {

	public constructor(
		private readonly templateStorage: ReadableStorage,
		private readonly contentStorage: WritableStorage) {
	}

	public createInstance(dataContract: DataContract): any {
		return this.generateZones(dataContract.zones);
	}

	public createPropertiesInstance(map: PropertyContractMap): any {
		return this.generateProperties(map);
	}

	private generateZones(map: ZoneContractMap): any {
		const zones = {};
		for (const zoneName of Object.keys(map)) {
			const zone = map[zoneName];
			zones[zoneName] = this.generateSections(zone.sections);
		}
		return zones;
	}

	private generateSections(map: SectionContractMap): any {
		const sections = {};
		for (const sectionName of Object.keys(map)) {
			const section = map[sectionName];
			sections[sectionName] = this.generateProperties(section.properties);
		}
		return sections;
	}

	private generateProperties(map: PropertyContractMap): any {
		const properties = {};
		for (const propertyName of Object.keys(map)) {
			const property = map[propertyName];
			properties[propertyName] = this.generateProperty(propertyName, property);
		}
		return properties;
	}

	private generateProperty(propertyName: string, property: PropertyContract): any {
		switch (property.type) {
			case PropertyContractType.text:
				const textProperty = property as TextPropertyContract;
				return textProperty.defaultValue;

			case PropertyContractType.boolean:
				const boolProperty = property as BooleanPropertyContract;
				return boolProperty.defaultValue;

			case PropertyContractType.dateTime:
				const dateProperty = property as DateTimePropertyContract;
				if (dateProperty.defaultValue) {
					return dateProperty.defaultValue;
				}
				if (dateProperty.now) {
					return dateToIsoString(new Date());
				}
				return null;

			case PropertyContractType.html:
				const htmlProperty = property as HtmlPropertyContract;
				if (htmlProperty.defaultFilePath) {
					return this.cloneTextFile(htmlProperty.defaultFilePath, propertyName, HTML_CONTENT_BASE_PATH, HTML_CONTENT_EXT);
				}
				return null;

			case PropertyContractType.markdown:
				const mdProperty = property as MarkdownPropertyContract;
				if (mdProperty.defaultFilePath) {
					return this.cloneTextFile(mdProperty.defaultFilePath, propertyName, MARKDOWN_CONTENT_BASE_PATH, MARKDOWN_CONTENT_EXT);
				}
				return null;

			case PropertyContractType.image:
				const imageProperty = property as ImagePropertyContract;
				if (imageProperty.defaultFilePath) {
					const entry = this.templateStorage.getEntry(['dataUrl', 'binary'], imageProperty.defaultFilePath);
					this.contentStorage.setContent(entry.contentType, imageProperty.defaultFilePath, entry.content);
					return imageProperty.defaultFilePath;
				}
				return null;

			case PropertyContractType.choice:
				const choiceProperty = property as ChoicePropertyContract;
				return choiceProperty.defaultValue? choiceProperty.defaultValue : null;

			case PropertyContractType.color:
				const colorProperty = property as ColorPropertyContract;
				return colorProperty.defaultValue? colorProperty.defaultValue : null;

			case PropertyContractType.collection