teratail header banner
teratail header banner
質問するログイン新規登録
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2802閲覧

[画像処理]グラデーションのディザリングを改良する

katahiromz

総合スコア186

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/11/11 12:15

編集2017/11/11 23:18

0

0

こんにちは、コンピュータ研究家の片山博文MZです。

https://github.com/katahiromz/WonGradientFill
https://github.com/katahiromz/WonGradientFill/blob/master/WonGradientFill.c
Win32APIのGDIを使って、GradientFillもどきを作っています。

GradientFillは、線形補間とディザリングを使って、なめらかにグラデーションを描画するWin32APIの関数です。

GradientFill
https://msdn.microsoft.com/ja-jp/library/cc410414.aspx

これをブラックボックスとして、まねして作るわけです。現在のコードではBayer Ditheringを使っていますが、ディザリングがあまりなめらかになりませんでした。

画像
https://jira.reactos.org/secure/attachment/43815/WonGradientFill.png

これにWin32APIのGetNearestColor関数などを使って、さらにhDCの論理パレットに合わせた、なめらかなディザリングができないかと考えております。

実装は、処理速度を重視しております。ふつつかですが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。

C++

1static INLINE BYTE BayerDithering(ULONG x, ULONG y, BYTE b) 2{ 3 #define BV(x) (x * 255 / 64) 4 static const BYTE s_bayer_64[] = 5 { 6 BV(0), BV(48), BV(12), BV(60), BV(3), BV(51), BV(15), BV(63), 7 BV(32), BV(16), BV(44), BV(28), BV(35), BV(19), BV(47), BV(31), 8 BV(8), BV(56), BV(4), BV(52), BV(11), BV(59), BV(7), BV(55), 9 BV(40), BV(24), BV(36), BV(20), BV(43), BV(27), BV(39), BV(23), 10 BV(2), BV(50), BV(14), BV(62), BV(1), BV(49), BV(13), BV(61), 11 BV(34), BV(18), BV(46), BV(30), BV(33), BV(17), BV(45), BV(29), 12 BV(10), BV(58), BV(6), BV(54), BV(9), BV(57), BV(5), BV(53), 13 BV(42), BV(26), BV(38), BV(22), BV(41), BV(25), BV(37), BV(21) 14 }; 15 const BYTE value1 = s_bayer_64[(y & 7) * 8 + (x & 7)]; 16 const BYTE value2 = s_bayer_64[(y & 7) * 8 + 7 ^ (x & 7)]; 17 if (value1 <= b) 18 { 19 if (value2 <= b) 20 return 255; 21 return 127; 22 } 23 else 24 { 25 if (value2 <= b) 26 return 127; 27 return 0; 28 } 29 /* return ((s_bayer_64[(y & 7) * 8 + (x & 7)] <= b) ? 255 : 0); */ 30#undef BV 31} 32

投稿2017/11/12 01:17

katahiromz

総合スコア186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問