問題已回答。有關更多信息,請參閱本文末尾的編輯#4。添加劑混合的繪圖圖像
我們目前正在研發一款相當不錯的遊戲製作引擎。我正在研究動畫創作者,並想知道是否可以使用添加混合來繪製圖像。
讓我解釋一下。
我們使用C#的System.Drawing庫,並使用Windows窗體。目前,用戶能夠通過導入帶框的動畫圖像(包含動畫的每個幀的圖像)來創建他的動畫,並且用戶能夠將這些框架拖放到他想要的任何地方。
實際的問題是,我們無法弄清楚如何繪製一個框架與添加劑混合。
下面是添加劑混合的例子,如果你不太明白。我不會責怪你,我很難用英文寫作。
我們使用以下方法在Panel上或直接在窗體上繪圖。例如,這裏是爲地圖編輯器繪製平鋪地圖的代碼。由於AnimationManager代碼亂七八糟,這個例子會更清晰。
using (Graphics g = Graphics.FromImage(MapBuffer as Image))
using (Brush brush = new SolidBrush(Color.White))
using (Pen pen = new Pen(Color.FromArgb(255, 0, 0, 0), 1))
{
g.FillRectangle(brush, new Rectangle(new Point(0, 0), new Size(CurrentMap.MapSize.Width * TileSize, CurrentMap.MapSize.Height * TileSize)));
Tile tile = CurrentMap.Tiles[l, x, y];
if (tile.Background != null) g.DrawImage(tile.Background, new Point(tile.X * TileSize, tile.Y * TileSize));
g.DrawRectangle(pen, x * TileSize, y * TileSize, TileSize, TileSize);
}
有沒有用添加劑繪圖如果是繪製圖像的一個可行的辦法,我會永遠感激,如果有人可以點我如何。謝謝。
EDIT#1:
對於繪製圖像,我們用的是彩色矩陣來設置這樣的色調和ALPH(不透明度):
ColorMatrix matrix = new ColorMatrix
(
new Single[][]
{
new Single[] {r, 0, 0, 0, 0},
new Single[] {0, g, 0, 0, 0},
new Single[] {0, 0, b, 0, 0},
new Single[] {0, 0, 0, a, 0},
new Single[] {0, 0, 0, 0, 1}
}
);
也許彩色矩陣可用於添加劑混合?
編輯#2:
剛剛發現this文章馬赫什昌。
在進一步瀏覽之後,即使色彩轉換可以完成很多工作,也可能無法使用色彩矩陣。 如果找到解決方案,我會回答我自己的問題。
謝謝你的幫助。
編輯#3:
XNA有很多關於混合文檔here的。我找到了用於在圖像的每個像素上完成疊加混合的公式。
PixelColor =(源* [1,1,1,1])+(目的地* [1,1,1,1])
也許有在當前上下文中使用此公式的一個方法是什麼? 我將在下次編輯時啓動50條賞金,我們確實需要這個工作。
再次感謝您的時間。
編輯#4
由於軸突,現在的問題就解決了。使用XNA和Spritebatch,你可以做到添加劑調合這樣做:
首先創建的GraphicsDevice和SpriteBatch
// In the following example, we want to draw inside a Panel called PN_Canvas.
// If you want to draw directly on the form, simply use "this" if you
// write the following code in your form class
PresentationParameters pp = new PresentationParameters();
// Replace PN_Canvas with the control to be drawn on
pp.BackBufferHeight = PN_Canvas.Height;
pp.BackBufferWidth = PN_Canvas.Width;
pp.DeviceWindowHandle = PN_Canvas.Handle;
pp.IsFullScreen = false;
device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.Reach, pp);
batch = new SpriteBatch(device);
然後,當它的時間上繪製控件或形式(與OnPaint事件例如),則可以使用下面的代碼塊
// You should always clear the GraphicsDevice first
device.Clear(Microsoft.Xna.Framework.Color.Black);
// Note the last parameter of Begin method
batch.Begin(SpriteSortMode.BackToFront, BlendState.Additive);
batch.draw(/* Things you want to draw, positions and other infos */);
batch.End();
// The Present method will draw buffer onto control or form
device.Present();
我不確定這是可能的直接向上的winforms,而不訴諸於自己的像素值操縱。將使用WPF託管組件作爲圖紙是一個選項嗎?WPF有能力更容易地設置混合模式。 – Dervall
@Dervall我們越搜索越多,我們開始認爲使用WPF託管組件是一個非常好的主意。也許沒有直接使用Winforms使用逐像素算法的解決方案。或者,也許有人會想出一些奇蹟? –
[.DrawImage with opacity?]的可能重複?(http://stackoverflow.com/questions/5519956/drawimage-with-opacity) –