0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Dxライブラリだけで画像の色を変えて使う(C++ Only)

Posted at

#前置き

png画像を読み込み、色データを変え、それからテクスチャに変換する一連の処理を
別スレッドで行いたい、と考えて、
OpenCvの導入や使い方も全然よくわからないために、いろいろ試してみてたら、
DxLibのBASEIMAGE型を使ったらうまくいきそうな感じなので、備忘録に

*C#向けDxLibではBASEIMAGE型(とそれを使う関数)が使用できない関係でC++限定です

*環境整備などはやってある前提で書いてますが、
何回もこのコードを実行をして確かめてみたところ、一度も不具合は起きていないため問題はないと
判断しています

#c++コード

重要なのはLoadAsyncTest関数の内部ですね


#include <iostream>
#include <DxLib.h>
#include <thread>

namespace {
	auto texture = -1;
}
 
void LoadAsyncTest() { 
	//BASEIMAGE型を使う処理 ここから

	BASEIMAGE base_image;
	 
	CreateBaseImageToFile(L"b8.png", &base_image);
	
	if (base_image.ColorData.ColorBitDepth <= 8) {
		//8ビット画像の色変え
		//
		//*
		// パレットの数(BASEIMAGE.ColorData.Paletteの要素数)は、256で固定なので、
		// ループ等でアクセスする際は、この範囲を超えないように気を付ける
		//*
		for (auto i = 0; i < 256; i++) {
			SetPaletteBaseImage(&base_image, i, 255, 255, 255, 255);
		}
	}
	else{
		for (auto x = 0; x < base_image.Width; x++) {
			for (auto y = 0; y < base_image.Height; y++) {
				//8ビット以外の画像の色変え
				SetPixelBaseImage(&base_image, x, y, 255, 255, 0, 255);
			}
		}
	}

	texture = CreateGraphFromBaseImage(&base_image);

	ReleaseBaseImage(&base_image);

	//BASEIMAGE型を使う処理 ここまで
}

int32_t main() {
	SetMultiThreadFlag(TRUE);
	ChangeWindowMode(TRUE);
	if (DxLib_Init() != 0) return -1;

	//非同期で画像読み込みと色変えとGraphに変換を実行
	std::thread th(LoadAsyncTest);

	while (ProcessMessage() == 0) {
		if (texture != -1) DrawGraph(70, 40, texture, TRUE);
	}

	th.detach();

	DxLib_End();

	return 0;
}


#最後に

C#(.net core 3.1 や.net 5)で、C#用DxLibを使って画像読み込みなどをマルチスレッドで実行すると、
謎の不具合が高確率で起きて突然クラッシュしまくりな上に、こうなる原因が全く分からず、
DxLib使うなら、C++に移行しないといけないかなって感じになってる

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?