10

この内容の文字列から 1 ビットのビットマップを書き込む可能性を探しています。

$str = "001011000111110000";

ゼロは白で、1 は黒です。BMP ファイルは 18 x 1 ピクセルになります。

24 ビット BMP ではなく、実際の 1 ビット BMP が必要です。

PHPのヘッダーと変換方法を知っている人はいますか?

4

3 に答える 3

5

それはちょっと変わったリクエストです:)

したがって、ここで使用したいのは、まず php-gd です。通常、これは、まともなレポを持つ任意の OS に php をインストールするときに含まれますが、それがあなたのためではない場合に備えて、ここでインストール手順を入手できます。

http://www.php.net/manual/en/image.setup.php

まず、画像の幅がどれくらい必要かを正確に把握する必要があります。高さは明らかに常に 1 です。

そう;

$str = $_GET['str'];
$img_width = strlen($str);

strlen は、$str 文字列に含まれる文字数を教えてくれます。1 文字あたり 1 ピクセルを指定しているため、文字数によって必要な幅が得られます。

アクセスを容易にするために、文字列を配列に分割し、各要素を個別のピクセルごとに配置します。

$color_array = str_split($str);

では、どのピクセルに描画するかの「ポインタ」を設定しましょう。これは php なので、これを初期化する必要はありませんが、整理しておくと便利です。

$current_px = (int) 0;

これで、GD を初期化してイメージの作成を開始できます。

$im = imagecreatetruecolor($img_width, 1);
// Initialise colours;
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);
// Now, start running through the array
foreach ($color_array as $y)
{
  if ($y == 1)
  {
    imagesetpixel ( $im, $current_px , 1 , $black );
  }
  $current_px++; // Don't need to "draw" a white pixel for 0. Just draw nothing and add to the counter.
}

これで画像が描画され、表示するだけで済みます。

header('Content-type: image/png');
imagepng($im);
imagedestroy($im);

$white 宣言はまったく必要ないことに注意してください。gd でさまざまな色を宣言する方法を理解してもらうために、そのままにしておきました。

これを使用する前に、おそらくこれを少しデバッグする必要があります。GD を使用してから長い時間が経ちました。とにかく、これが役に立てば幸いです!

于 2012-06-25T00:15:51.827 に答える
2

それは奇妙な要求ではありません。

私は質問の目的に完全に同意します。実際、1ビットのモノクロ画像を管理する必要があります。

答えは次のとおりです。

  • GD は、PHP Web サイトで十分に文書化されていません。
  • イメージをゼロから作成する場合は、imagecreate()またはを使用する必要がありますimagecreatetruecolor()
  • 上記の方法 (関数) はどちらも、1 ビット イメージをゼロから作成することはできないようです。
  • 外部画像、1bitモノクロpngを作成し、.で読み込むことで解決しましたimagecreatefrompng()

さらに、ここから公式ライブラリのオープン ソース コードをダウンロードしました。公式 Bitbucket リポジトリ

私が見つけたものgd.h?:

上記の関数の定義:

/* Functions to manipulate images. */

/* Creates a palette-based image (up to 256 colors). */
BGD_DECLARE(gdImagePtr) gdImageCreate (int sx, int sy);

/* An alternate name for the above (2.0). */
 \#define gdImageCreatePalette gdImageCreate

/* Creates a truecolor image (millions of colors). */
BGD_DECLARE(gdImagePtr) gdImageCreateTrueColor (int sx, int sy);

したがって、「公式」の解決策は次のとおりです。( GD関数imagecreate()をラップする)で2色のパレット画像を作成します。gdImageCreate()

「代替」の解決策は、外部画像、1 ビットのモノクロ png を作成し、imagecreatefrompng()上記のようにそれを使用することです。

于 2013-09-17T14:34:57.357 に答える