2008-12-08 9 views
6

Czy istnieje biblioteka .NET, której mogę użyć do programowego generowania własnych obrazów GIF?Jak mogę wygenerować obrazy GIF w .NET?

Co najmniej chciałbym zbudować go piksel po pikselach. Lepiej byłoby wspierać tekst i kształty.

Oto przykład tego, co próbuję zrobić. Kpiłem z tego w Photoshopie i hellipie;

Number line graphic http://img143.imageshack.us/img143/5458/dollarlineot9.gif

Co polecacie?

+0

Czy jest jakiś szczególny powód jest musi być w formacie .gif obraz? Jedynym powodem, dla którego mogę myśleć o używaniu .gif jest to, czy obraz powinien być animowany. Jeśli nie, inne formaty (takie jak png i jpg) oferują znacznie lepsze współczynniki kompresji i większą elastyczność ... –

+0

Bez konkretnego powodu. GIF to prosty format bezstratny z szeroką kompatybilnością z przeglądarką internetową. –

Odpowiedz

12
Bitmap bmp = new Bitmap(xSize, ySize, PixelFormat.Format32bppArgb); 
using (Graphics g = Graphics.FromImage(bmp)) { 
    // Use g and/or bmp to set pixels, draw lines, show text, etc... 
} 
bmp.Save(filename, ImageFormat.Gif); 

zadanie

+0

Dokładnie. Czytaj w przestrzeni nazw System.Drawing, aby zrozumieć, jak narysować potrzebne linie itp. –

+0

Ty da man. Jeśli to nie sprawi, czekam na SO. – MusiGenesis

+0

Chociaż technicznie nie można tak naprawdę ustawić pikseli za pomocą obiektu Graphics (można wypełnić prostokąty 1-pikselowe). SetPixel i GetPixel znajdują się w obiekcie Bitmap. – MusiGenesis

0

Dlaczego nie używać formantu wykresu zamiast próbować generować pliki GIF? O ile wymagania nie są ściśle związane z generowaniem tego konkretnego GIF, myślę, że użycie kontrolki wykresu zapewnia większą elastyczność.

+0

Czy jest to część platformy .NET? –

+0

Nie. Ale pytanie nie ograniczało odpowiedzi do .NET Framework. Powiedział "bibliotekę .net". – Tundey

+0

w rzeczywistości jest teraz: http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot -gt.aspx –

0

Podoba mi się my company's products. Będziesz mógł czytać i pisać gify i tworzyć je z całego materiału. Jest to aplikacja runtime royalty bezpłatna dla aplikacji komputerowych, licencjonowana dla serwerów.

1

Dlaczego po prostu nie używać przestrzeni nazw System.Drawing? Wszystko, czego potrzebujesz, powinno tam być.

4

uwagę, że oprócz metody bmp.Save(filename, ImageFormat.Gif);, istnieje bmp.Save(stream, ImageFormat.Gif); które pozwalają na tworzenie & wyjście obrazu do strony, bez niego nigdy do zapisanych na serwerach twardym.

2

Oto początek tego w klasach w przestrzeni nazw System.Drawing. Rysuje linię z dwoma polami, aby zademonstrować obsługę kształtów na wyższym poziomie niż po prostu ustawianie pikseli.

// add a reference to System.Drawing.dll 
using System; 
using System.Drawing; 
using System.Drawing.Imaging; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Bitmap bmp = new Bitmap(400, 100); 

      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       g.FillRectangle(Brushes.White, 0.0f, 0.0f, 400f, 100f); 

       // draw line 
       using (Pen p = new Pen(Color.Black, 1.0f)) 
       { 
        g.DrawLine(p, 0, 49, 399, 49); 
       } 

       // Draw boxes at start and end 
       g.FillRectangle(Brushes.Blue, 0, 47, 5, 5); 
       g.FillRectangle(Brushes.Blue, 394, 47, 5, 5); 
      } 


      bmp.Save("test.gif", ImageFormat.Gif); 
      bmp.Dispose(); 
     } 
    } 
} 
1

Przykładem Jak używać HttpHandler do tworzenia obrazu i wysłać w strumieniu (stosując kod obrazka już zamieszczonych tutaj).

Zastosowanie:

<img src="createChart.ashx?data=1"/> 

Kod:

public class CreateChart : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     string data = context.QueryString["data"]; // Or get it from a POST etc 

     Bitmap image = new Bitmap(xSize, ySize, PixelFormat.Format32bppArgb); 
     using (Graphics g = Graphics.FromImage(Image)) 
     { 
      // Use g to set pixels, draw lines, show text, etc... 
     } 
     BinaryStream s = new BinaryStream(); 

     image.Save(s, ImageFormat.Gif); 

     context.Response.Clear(); 
     context.Response.ContentType = "image/gif"; 
     context.Response.BinaryWrite(s); 
     context.Response.End(); 
    } 

    public bool IsReusable { get { return false; } } 
} 
+0

Właściwie powinieneś móc pominąć BinaryStream i napisać go bezpośrednio do Reposnse: bmp.Save (Response.OutputStream, ImageFormat.Gif); –

Powiązane problemy