日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GDI+中常见的几个问题(6)

發(fā)布時(shí)間:2024/4/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GDI+中常见的几个问题(6) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

6.2 GIF

GIF的全稱是圖像交換格式Graphics Interchange Format,是CompuServe公司在1987年創(chuàng)建并使用的。這種格式使用8位索引值來表達(dá)一個(gè)像素,也就是說1個(gè)像素1個(gè)byte,最多可以表示256種顏色。它使用LZW無損壓縮算法來對圖像進(jìn)行壓縮,之后這家公司又和幾家其他的公司發(fā)明了PNG文件格式,并被更廣泛地應(yīng)用在Web以及其他領(lǐng)域。GIF支持動畫,可以保存數(shù)個(gè)幀并不斷地播放。關(guān)于動畫的部分我們將會放到非常后面來講,現(xiàn)在只談?wù)凣IF的透明。

在GIF文件的頭部有一個(gè)調(diào)色板Palette,里面保存了顏色的信息。一般而言,如果對GIF進(jìn)行LockBits的操作,只能把它lock成Format*bppIndexed,這樣才不會導(dǎo)致前面調(diào)色板信息的丟失,在處理上也更方便一些。在調(diào)色板里面定義了透明的顏色,也就是說當(dāng)實(shí)際數(shù)據(jù)為這個(gè)顏色時(shí),那個(gè)位置的顏色為透明。讓我們來看看Palette是怎么使用的。?順便再說一句,GIF沒有半透明,只支持完全透明或者不透明。此外,在一個(gè)調(diào)色板中,只有一種顏色可以設(shè)置為透明,這是GIF標(biāo)準(zhǔn)所決定的。

?

?1?????????public?static?unsafe?void?ConvertTransparancyGif(int?colorIndex,?string?baseFile,?string?outputFile)
?2?????????{
?3?????????????using?(FileStream?fs?=?new?FileStream(baseFile,?FileMode.Open,?FileAccess.Read))
?4?????????????{
?5?????????????????Bitmap?img?=?(Bitmap)Image.FromStream(fs,?false,?false);
?6?????????????????int?width?=?img.Width;
?7?????????????????int?height?=?img.Height;
?8?
?9?????????????????Bitmap?resultbmp?=?new?Bitmap(width,?height,?PixelFormat.Format8bppIndexed);
10?????????????????ColorPalette?palette?=?resultbmp.Palette;
11?????????????????int?n?=?0;
12?????????????????foreach?(Color?tc?in?img.Palette.Entries)
13?????????????????{
14?????????????????????palette.Entries[n]?=?Color.FromArgb(255,?tc);
15?????????????????????n++;
16?????????????????}
17?
18?????????????????palette.Entries[colorIndex]?=?Color.FromArgb(0,?palette.Entries[colorIndex]);
19?????????????????resultbmp.Palette?=?palette;
20?
21?????????????????//now?to?copy?the?actual?bitmap?data?
22?????????????????BitmapData?src?=?img.LockBits(
23?????????????????????new?Rectangle(0,?0,?width,?height),
24?????????????????????ImageLockMode.ReadOnly,
25?????????????????????img.PixelFormat);
26?
27?????????????????BitmapData?dst?=?resultbmp.LockBits(
28?????????????????????new?Rectangle(0,?0,?width,?height),
29?????????????????????ImageLockMode.WriteOnly,
30?????????????????????resultbmp.PixelFormat);
31?
32?????????????????byte*?pSrc?=?(byte*)src.Scan0.ToPointer();
33?????????????????byte*?pDst?=?(byte*)dst.Scan0.ToPointer();
34?????????????????int?offset?=?src.Stride?-?width;
35?
36?????????????????//steps?through?each?pixel?
37?????????????????for?(int?y?=?0;?y?<?height;?y++)
38?????????????????{
39?????????????????????for?(int?x?=?0;?x?<?width;?x++)
40?????????????????????{
41?????????????????????????pDst[0]?=?pSrc[0];
42?????????????????????????pDst++;
43?????????????????????????pSrc++;
44?????????????????????}
45?????????????????????pDst?+=?offset;
46?????????????????????pSrc?+=?offset;
47?????????????????}
48?
49?????????????????//unlock?the?bitmaps?
50?????????????????img.UnlockBits(src);
51?????????????????resultbmp.UnlockBits(dst);
52?
53?????????????????resultbmp.Save(outputFile,?ImageFormat.Gif);
54?
55?????????????????img.Dispose();
56?????????????????resultbmp.Dispose();
57?????????????}?
59?????????}

?

?

請注意,在這里,我讀圖的時(shí)候和我之前推薦的方法不同。 我沒有創(chuàng)建一個(gè)新的Bitmap,這是因?yàn)樵趧?chuàng)建新的Bitmap的時(shí)候,調(diào)色板信息會完全丟失,所以Indexed的格式不可以隨意進(jìn)行復(fù)制,否則將造成信息的丟失。這也就是為什么當(dāng)時(shí)我說這是一個(gè)土辦法的原因。真正的好辦法是復(fù)制那個(gè)流,而不是直接去復(fù)制Bitmap。不過那是看需求的。在創(chuàng)建一個(gè)帶透明顏色的GIF的時(shí)候,只要?jiǎng)?chuàng)建一個(gè)調(diào)色板,就一切OK了。這比Alpha通道修正要簡單。還可以參考KB 319061 http://support.microsoft.com/kb/319061/en-us


最后提一句,Bitmap類還提供了一個(gè)MakeTransparent方法用于設(shè)置透明顏色,不過只對PNG有效。

總結(jié)

以上是生活随笔為你收集整理的GDI+中常见的几个问题(6)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。