C++で超簡単に画像出力+サンプル

# [準備](https://github.com/nothings/stb/blob/master/stb_image_write.h)

[**"stb_image_write.h"**](https://github.com/nothings/stb/blob/master/stb_image_write.h)をダウンロードして、これから作る `main.cpp` と同じフォルダに入れる。
後は以下のサンプルを貼り付けて実行。

以下のサンプルはC++11以降の環境で動作する。

# 何もない画像

```cpp:main.cpp
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"

#include <cstddef>
#include <memory>
#include <new>

struct RGBA {
	unsigned char r, g, b, a; //赤, 緑, 青, 透過
	RGBA() = default;
	constexpr RGBA(const unsigned char r_, const unsigned char g_, const unsigned char b_, const unsigned char a_) :r(r_), g(g_), b(b_), a(a_) {}
};

int main() {

	constexpr std::size_t width{ 512 }, height{ 512 }; //幅と高さ

	std::unique_ptr<RGBA[][width]> rgba(new(std::nothrow) RGBA[height][width]);
	if (!rgba) return -1;

	stbi_write_png("picture_0.png", static_cast<int>(width), static_cast<int>(height), static_cast<int>(sizeof(RGBA)), rgba.get(), 0);
}
```

![picture_0.png](https://Kasugaccho.github.io/DungeonPicture/Picture/reference/picture_0.png)

# 赤いHD画像

```cpp:main.cpp
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"

#include <cstddef>
#include <memory>
#include <new>

struct RGBA {
	unsigned char r, g, b, a; //赤, 緑, 青, 透過
	RGBA() = default;
	constexpr RGBA(const unsigned char r_, const unsigned char g_, const unsigned char b_, const unsigned char a_) :r(r_), g(g_), b(b_), a(a_) {}
};

int main() {

	constexpr std::size_t width{ 1280 }, height{ 720 }; //幅と高さ

	std::unique_ptr<RGBA[][width]> rgba(new(std::nothrow) RGBA[height][width]);
	if (!rgba) return -1;

	for (std::size_t row{}; row < height; ++row)
		for (std::size_t col{}; col < width; ++col) {
			rgba[row][col].r = 255; //赤
			rgba[row][col].g = 0;
			rgba[row][col].b = 0;
			rgba[row][col].a = 255; //不透過
		}

	stbi_write_png("picture_1.png", static_cast<int>(width), static_cast<int>(height), static_cast<int>(sizeof(RGBA)), rgba.get(), 0);
}
```

![picture_2.png](https://Kasugaccho.github.io/DungeonPicture/Picture/reference/picture.png)


# ホワイトノイズ

```cpp:main.cpp
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"

#include <cstddef>
#include <memory>
#include <new>
#include <random>

struct RGBA {
	unsigned char r, g, b, a; //赤, 緑, 青, 透過
	RGBA() = default;
	constexpr RGBA(const unsigned char r_, const unsigned char g_, const unsigned char b_, const unsigned char a_) :r(r_), g(g_), b(b_), a(a_) {}
};

int main() {

	constexpr std::size_t width{ 1280 }, height{ 720 }; //幅と高さ

	std::unique_ptr<RGBA[][width]> rgba(new(std::nothrow) RGBA[height][width]);
	if (!rgba) return -1;

	std::random_device rd;
	std::mt19937 mt;
	mt.seed(rd());

	std::uniform_int_distribution<> uid(0, 255);

	for (std::size_t row{}; row < height; ++row)
		for (std::size_t col{}; col < width; ++col) {
			rgba[row][col].r = uid(mt); //赤
			rgba[row][col].g = uid(mt);
			rgba[row][col].b = uid(mt);
			rgba[row][col].a = 255; //不透過
		}

	stbi_write_png("picture_2.png", static_cast<int>(width), static_cast<int>(height), static_cast<int>(sizeof(RGBA)), rgba.get(), 0);
}
```

![picture_2.png](https://Kasugaccho.github.io/DungeonPicture/Picture/reference/picture_2.png)


# RPGマップ

```cpp:main.cpp
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"

#include <cstddef>
#include <memory>
#include <new>
#include <random>

struct RGBA {
	unsigned char r, g, b, a; //赤, 緑, 青, 透過
	RGBA() = default;
	constexpr RGBA(const unsigned char r_, const unsigned char g_, const unsigned char b_, const unsigned char a_) :r(r_), g(g_), b(b_), a(a_) {}
	constexpr bool operator&&(const RGBA& rgba_) noexcept {
		return this->r == rgba_.r && this->g == rgba_.g && this->b == rgba_.b && this->a == rgba_.a;
	}
};

int main() {

	constexpr std::size_t width{ 512 }, height{ 512 }; //幅と高さ

	std::unique_ptr<RGBA[][width]> rgba(new(std::nothrow) RGBA[height][width]);
	if (!rgba) return -1;

	std::random_device rd;
	std::mt19937 mt;
	mt.seed(rd());
	std::uniform_int_distribution<> uid(0, 255);

	std::uniform_int_distribution<> uid_probability(0, 1);
	std::uniform_int_distribution<> uid_b(0, 3);

	for (std::size_t row{}; row < height; ++row)
		for (std::size_t col{}; col < width; ++col) {
			rgba[row][col].r = 41;
			rgba[row][col].g = 40;
			rgba[row][col].b = 159;
			rgba[row][col].a = 255;
		}
	for (std::size_t row{ 1 }; row < height - 1; ++row)
		for (std::size_t col{ 1 }; col < width - 1; ++col) {
			if (uid_probability(mt)) rgba[row][col] = RGBA(41, 40, 159, 255);
			else switch (uid_b(mt))
			{
			case 0:rgba[row][col] = RGBA(101, 163, 56, 255); break;
			case 1:rgba[row][col] = RGBA(223, 203, 140, 255); break;
			case 2:rgba[row][col] = RGBA(9, 100, 5, 255); break;
			case 3:rgba[row][col] = RGBA(164, 143, 50, 255); break;
			}
		}
	for (std::size_t i{}; i < 700; ++i)
		for (std::size_t row{ 1 }; row < height - 1; ++row)
			for (std::size_t col{ 1 }; col < width - 1; ++col) {
				if ((rgba[row][col - 1] && rgba[row][col + 1]) && ((rgba[row][col + 1]) && (rgba[row - 1][col])) && (rgba[row - 1][col] && rgba[row + 1][col])) {
					rgba[row][col] = rgba[row][col + 1];
				}
				else switch (uid_b(mt))
				{
				case 0:rgba[row][col] = rgba[row][col - 1]; break;
				case 1:rgba[row][col] = rgba[row][col + 1]; break;
				case 2:rgba[row][col] = rgba[row - 1][col]; break;
				case 3:rgba[row][col] = rgba[row + 1][col]; break;
				}
			}

	stbi_write_png("picture_3.png", static_cast<int>(width), static_cast<int>(height), static_cast<int>(sizeof(RGBA)), rgba.get(), 0);
}
```

![picture_3.png](https://Kasugaccho.github.io/DungeonPicture/Picture/reference/picture_3.png)

##ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

ソースコードは自由に使用してください。