2012-06-23 11 views
7

szukam możliwości napisać 1 bitowej bitmapy z ciągiem z tej treści:Stwórz 1 bitową bitmapę (monochromatyczny) w php

$str = "001011000111110000"; 

Zero jest biały i jeden czarny. Plik BMP będzie miał 18 x 1 px.

Nie chcę 24-bitowego BMP, ale prawdziwy 1-bitowy BMP.

Czy ktoś zna nagłówek i metodę konwersji w PHP?

+1

+1 za interesujące pytania! – hexafraction

Odpowiedz

3

To trochę dziwne życzenie :)

Więc czego chcesz używać tutaj jest php-gd, na początek. Zwykle jest to uwzględnione podczas instalowania php na dowolnym systemie operacyjnym z przyzwoitymi transakcjami repo, ale wystarczy, że to nie jest dla ciebie, możesz pobrać instrukcje instalacji tutaj;

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

Po pierwsze, musimy dowiedzieć się dokładnie, jak duży obraz trzeba będzie szerokości; wysokość oczywiście zawsze będzie jedna.

Tak;

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

strlen powie nam, ile znaków znajduje się w STR string $, a ponieważ dajemy jeden piksel za charakter, ilość znaków da nam żądaną szerokość.

Aby ułatwić dostęp, podziel łańcuch na tablicę - z każdym elementem dla każdego oddzielnego piksela.

$color_array = str_split($str); 

Teraz ustawmy "wskaźnik", dla którego rysujemy piksel. To php, więc nie musisz tego inicjować, ale miło jest być w porządku.

$current_px = (int) 0; 

A teraz można zainicjować GD i rozpocząć tworzenie obrazu;

$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. 
} 

Spowoduje to narysowanie obrazu, a następnie wszystko, czego potrzebujesz, to wyświetlić;

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

Zauważ, że $ biały deklaracja nie jest potrzebna w ogóle - po prostu zostawili go do daje wyobrażenie o tym, jak można zadeklarować różne kolory z gd.

Będziesz prawdopodobnie potrzebował trochę debugować, zanim go użyjesz - minęło sporo czasu, odkąd użyłem GD. W każdym razie, miej nadzieję, że to pomaga!

+0

Dziękuję za odpowiedź, ale szukam monochromatycznego generatora bmp, prawdopodobnie w czystym php. W końcu znalazłem właściwą drogę i rozwiązanie, a teraz mogę wygenerować poprawny obraz jednobitowy bmp monochromatyczny! Dzięki temu rozwiązaniu mogę wygenerować obraz rastrowy z kodem kreskowym o najniższym możliwym rozmiarze gotowym do zrywacza druku. – htmlandrea

+0

Ah, rozumiem. Cóż, znalazłem kilka klas, które mogą pomóc w użyciu GD do tworzenia obrazów BMP; możesz je znaleźć tutaj: http://www.phpclasses.org/package/5991-PHP-Load-and-save-images-in--BMP-format.html Mam nadzieję, że reszta informacji była na najmniej przydatne dla ciebie :) – Eoghan

+0

@htmlandrea: byłoby miło, gdybyś mógł podzielić się rozwiązaniem ... – Gonzo

0

To NIE jest dziwna prośba.

Całkowicie zgadzam się z celem pytania, w rzeczywistości muszę zarządzać niektórymi jednobitowymi obrazami 1-bitowymi.

Odpowiedź brzmi:

  • GD nie jest dobrze udokumentowana w witrynie PHP.
  • Gdy chcesz utworzyć obraz od podstaw trzeba użyć imagecreate() lub imagecreatetruecolor()
  • Wydaje się, że oba właśnie wymienionych metod (funkcji) nie może tworzyć obrazy 1BIT od zera.
  • Rozwiązałem, tworząc zewnętrzny obraz, 1bit monochromatyczny png, ładując go z imagecreatefrompng().

Ponadto: Właśnie ściągnąłem kodu open source urzędnik biblioteki stąd Official Bitbucket Repository

Co znalazłem w gd.h:

definicji wyższych wymienionych funkcji:

/* 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); 

Więc "oficjalne" rozwiązanie to: utwórz 2-kolorowy obraz palety z imagecreate() (który otacza funkcję GD gdImageCreate() jon).

"Alternatywnym" rozwiązaniem jest stworzenie zewnętrznego obrazu, jednobitowego monochromatycznego png, i to z imagecreatefrompng(), jak wspomniałem powyżej.

Powiązane problemy