سؤال

وأنا أحاول لإرجاع GIF الشفاف من صفحة .aspx للعرض داخل صفحة الويب. واني اسعى الى الحصول على صورة لديك الشفافية، ولكن أنا فقط الحصول على إبقاء الأسود يجري حيث الصورة يجب أن تكون شفافة.

لا أحد يعرف ما أفعله خطأ؟

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles Me.Load
    '' Change the response headers to output a GIF image.
    Response.Clear()
    Response.ContentType = "image/gif"

    Dim width = 110
    Dim height = width

    '' Create a new 32-bit bitmap image
    Dim b = New Bitmap(width, height)

    '' Create Grahpics object for drawing
    Dim g = Graphics.FromImage(b)

    Dim rect = New Rectangle(0, 0, width - 1, height - 1)

    '' Fill in with Transparent
    Dim tbrush = New System.Drawing.SolidBrush(Color.Transparent)
    g.FillRectangle(tbrush, rect)

    '' Draw Circle Border
    Dim bPen = Pens.Red
    g.DrawPie(bPen, rect, 0, 365)

    '' Fill in Circle
    Dim cbrush = New SolidBrush(Color.LightBlue)
    g.FillPie(cbrush, rect, 0, 365)


    '' Clean up
    g.Flush()
    g.Dispose()

    '' Make Transparent
    b.MakeTransparent()

    b.Save(Response.OutputStream, Imaging.ImageFormat.Gif)
    Response.Flush()
    Response.End()
End Sub
هل كانت مفيدة؟

المحلول

للأسف، لا توجد وسيلة سهلة لإنشاء المتحركة شفافة باستخدام كائن صورة نقطية. (راجع هذه KB المقالة )

وبدلا من ذلك يمكنك استخدام صيغة PNG التي تدعم الشفافية مع الرمز الذي تستخدمه.

نصائح أخرى

نعم، كما ذكر جيروم، وليس هناك أي حال لخلق شفافية في GIF باستخدام كائن نقطية. حماقة!

حسنا، على أي حال، لقد غيرت قانون بلدي لتوليد PNG وجميع الأعمال كما هو متوقع.

وهناك عمل واحد صغير حول لم تحتاج إلى القيام به لأنك لا يمكن أن يكتب في PNG مباشرة إلى OutputStream. كنت بحاجة لكتابة PNG إلى MemoryStream، ومن ثم كتابة أنه من أصل لOutputStream.

وهنا هو رمز النهائي لتنفيذ بلدي:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles Me.Load
    '' Change the response headers to output a JPEG image.
    Response.Clear()
    Response.ContentType = "image/png"

    Dim width = 11
    Dim height = width

    '' Create a new 32-bit bitmap image
    Dim b = New Bitmap(width, height)

    '' Create Grahpics object for drawing
    Dim g = Graphics.FromImage(b)

    '' Fill the image with a color to be made Transparent after drawing is finished.
    g.Clear(Color.Gray)

    '' Get rectangle where the Circle will be drawn
    Dim rect = New Rectangle(0, 0, width - 1, height - 1)

    '' Draw Circle Border
    Dim bPen = Pens.Black
    g.DrawPie(bPen, rect, 0, 365)

    '' Fill in Circle
    Dim cbrush = New SolidBrush(Color.Red)
    g.FillPie(cbrush, rect, 0, 365)

    '' Clean up
    g.Flush()
    g.Dispose()

    '' Make Transparent
    b.MakeTransparent(Color.Gray)

    '' Write PNG to Memory Stream then write to OutputStream
    Dim ms = New MemoryStream()
    b.Save(ms, Imaging.ImageFormat.Png)
    ms.WriteTo(Response.OutputStream)

    Response.Flush()
    Response.End()
End Sub

ومن <م> ممكن ، <م> لكن ليس من السهل
إذا كنت قادرا على استخدام التعليمات البرمجية غير آمنة في المشروع، وهناك عدد قليل من الطرق لاستخدام مؤشرات إلى مزق من خلال جدول الألوان، وجعل عمل الشفافية.

ووالتطبيق أشكال العينة التي كتبها بوب باول متاح هنا http://www.bobpowell.net/giftransparency . HTM . اعتدت الاختلاف على هذا الأسلوب على معالج شبكة الإنترنت قبل بضع سنوات أن تم الحصول على ضرب حوالي 10 مليون مرة في الشهر، ويبدو أن تعمل بشكل جيد.

إذا كنت فقط باستخدام pallete ألوان محدودة يمكنك تقليل تجهيز جدول الألوان لمجرد الألوان التي تحتاج إليها (لا أتذكر بالضبط كيف فعلت ذلك ...).

وأن يقال، وبابوا نيو غينيا هو crapload المتري أسهل.

وهنا بعض التعليمات البرمجية لديك GIF (التي لديها بالفعل الشفافية في ذلك) تتحول (المفترض تريد تغيير حجمه) في نقطية ومن ثم يمكن أن تظهر بشكل صحيح مع انها الشفافية.

imagePath = System.Web.HttpContext.Current.Request.MapPath(libraryPath + reqImageFile);
System.Drawing.Image image = null;
Bitmap resizedImage = null;

if (reqWidth == 0) { reqWidth = image.Width; }
if (reqHeight == 0) { reqHeight = image.Height; }
image = System.Drawing.Image.FromFile(imagePath);
reqWidth = image.Width;
reqHeight = image.Height;

//here is the transparency 'special' treatment
resizedImage = new Bitmap(reqWidth, reqHeight, PixelFormat.Format8bppIndexed);
ColorPalette pal = resizedImage.Palette;
for (int i = 0; i < pal.Entries.Length; i++)
{
       Color col = pal.Entries[i];
       pal.Entries[i] = Color.FromArgb(0, col.R, col.G, col.B);
}
resizedImage.Palette = pal;
BitmapData src = ((Bitmap)image).LockBits(new Rectangle(0, 0, reqWidth, reqHeight),  ImageLockMode.ReadOnly, image.PixelFormat);
BitmapData dst = resizedImage.LockBits(new Rectangle(0, 0, resizedImage.Width, resizedImage.Height),
ImageLockMode.WriteOnly, resizedImage.PixelFormat);
((Bitmap)image).UnlockBits(src);
resizedImage.UnlockBits(dst);

وحظا سعيدا!

وغريغوار Lafortune

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top