|
分類:[C#]
VS 2013 C# で画像処理を行うプログラムを作っています。
getPixel, setPixel を使う方法では時間がかかるので、
Bitmap を byte[] に変え、加工をした後で Bitmap に戻すという方法を
とっています。
具体的にはJPEGの一部を透過し、PNGに変換するもので、
試しにRGB全て100(灰色)、透明度127(半分)に書き換えて保存した所、
透過を持つPNGを読み込んでbyte[]に変換したものは正しく半透明なグレーで
保存され、JPEGを元にbyte[]にしたものは不透明なグレー画像で保存されました。
保存にはどちらも img2.Save(保存先, ImageFormat.Png) を使用しています。
どのようにすれば読み込み元のファイル形式に関係なく透明度を持つPNG
ファイルを書き出すことができるのでしょうか?
書き換えは byte[] を4バイト飛ばしでループさせ、次のようにしています。
Bitmap bmp = new Bitmap(ファイル);
byte[] buf = bitmapToBytes(bmp);
for(int i=0;i<buf.Length;i += 4){
b = buf[i];
g = buf[i + 1];
r = buf[i + 2];
a = buf[i + 3];
buf[i] = 100;
buf[i + 1] = 100;
buf[i + 2] = 100;
buf[i + 3] = 127;
}
bmp.Dispose();
Bitmap bmp2 = bytesToBitmap(buf);
変換に用いている関数は次です。
public byte[] bitmapToBytes(Bitmap bmp)
{
BitmapData bmpdat = (bmp).LockBits(
new Rectangle(Point.Empty, bmp.Size),
ImageLockMode.ReadWrite,
PixelFormat.Format32bppArgb);
byte[] pixels = new byte[bmpdat.Stride * bmpdat.Height];
Marshal.Copy(bmpdat.Scan0, pixels, 0, pixels.Length);
return pixels;
}
public Bitmap bytesToBitmap(byte[] buf, int width, int height)
{
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
BitmapData bd = bmp.LockBits(
new Rectangle(0, 0, width, height),
ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
Marshal.Copy(buf, 0, bd.Scan0, buf.Length);
bmp.UnlockBits(bd);
return bmp;
}
|