2012-02-16 9 views
5

Próbuję wymyślić bardziej efektywny sposób tworzenia obrazu 1px na 1px (jpg, png i gif) z jednego kodu koloru RGB, w php .Jak przekonwertować RGB na 1px base64 zakodowane dane uri w php

Poniższy przykład ilustruje jedną z metod wykonania, ale miałem nadzieję na jakiś algorytm, który dostarczy mi takie same wyniki bez konieczności ładowania jakichkolwiek bibliotek lub rozszerzeń php.

przykład:

function rgbToDataUri($r,$g,$b,$type) 
{ 
    $im = imageCreateTrueColor(1, 1); 

    imageFill($im, 0, 0, ImageColorAllocate($im,$r,$g,$b)); 

    ob_start(); 

    switch($type) 
    { 
     case 'gif': 
      imageGif($im); 
      break; 
     case 'jpg': 
     case 'jpeg': 
      imageJpeg($im); 
      break; 
     default: 
      imagePng($im); 
    } 

    $img = ob_get_contents(); 

    ob_end_clean(); 

    return 'data:image/' . $type . ';base64,' . base64_encode($img); 
} 

echo rgbToDataUri(0,0,0,'gif'); 

wyjściowa:

data:image/gif;base64,R0lGODdhAQABAIAAAAQCBAAAACwAAAAAAQABAAACAkQBADs= 

Kim bramek (w kolejności priorytecie)

  1. niskie zużycie pamięci
  2. Wysoka wydajność procesor
  3. wysoka prędkość obróbki

wymagania obejmują nośną gif, JPG i PNG. W każdym przypadku od 20 do 50 z tych pojedynczych pikseli będzie tworzone przy każdym żądaniu (każdy piksel jest niezależny od pozostałych).

W jaki sposób można uzyskać plik binarny dla jednokolorowego obrazu 1px?

+1

Twój kod jest bardzo prosty/prosty, jak jest. Niemal na pewno nie chcesz zaimplementować wszystkich różnych formatów obrazu ręcznie. – Amber

+0

A co z wyprowadzaniem BMP? W przypadku pojedynczego piksela jest on tak samo wydajny jak pozostałe trzy formaty i jest prawdopodobnie dość prosty, więc możesz produkować plik binarny bezpośrednio przy użyciu nieco przesunięcia bitów i "pakowania" bez większego nakładu pracy. – deceze

+0

@amber Niestety, prostota nie jest celem tego ćwiczenia. –

Odpowiedz

0

Nie jestem ekspertem w tej dziedzinie. Ale natknąłem się na "ImageMagick", który jest natywnym rozszerzeniem PHP do tworzenia i modyfikowania obrazów. Może czytać, konwertować i zapisywać obrazy w różnych formatach (ponad 100), w tym DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG i TIFF.

+2

Z pewnością nie pomoże mu to w osiągnięciu zamierzonych celów: mała pamięć, użycie procesora, szybkość. – RobinUS2

+0

Dzięki, ale RobinUS2 ma rację. –

0

Proponuję zachować ciąg binarny dla każdego obsługiwanego obrazu o wielkości 1 x 1 piksel i znaleźć miejsce, w którym przechowuje dane kolorów (przy użyciu dostępnych specyfikacji). Następnie wystarczy umieścić potrzebny kolor i kodować base64.

Powinno to zrobić przynajmniej dla plików PNG i GIF. Mają palety, a wszystkie dane kolorów są przechowywane w jednym miejscu. JPG, z drugiej strony, nie ma zwykłego RGB, więc jest nieco trudniejsze (i zdecydowanie nie jest najlepszym wyborem dla obrazu 1x1).

+0

Rozważałem tę metodę, ale obawiam się, że pobieranie (opóźnienie) może być zbyt dużym wąskim gardłem dla tego konkretnego ćwiczenia. –

+0

@BillH Modyfikowanie 4 bajtów w ciągu, który jest już zapisany w pamięci, nie jest wąskim gardłem. Kodowanie base64 może być jednym z nich, ale można również zaimplementować zakodowaną pamięć podręczną dla wcześniejszych wartości lub (jeśli masz pewną wiedzę na temat danych). Jednak ta ostatnia zwiększa zużycie pamięci, co jest priorytetem 1 w stosunku do użycia procesora. – Lyth