0

画像のアルファ係数を変更する関数を作成しました。私は setpixel と getpixel を使用していますが、これは非常に遅いです。Lockbits 方式の方が高速であることがわかりました。Lockbits を使用するにはどうすればよいですか? これが私の現在のコードです:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private static Image Tran(Image s,int alpha)
        {
            int x = 0, y = 0;
            Bitmap tImage = new Bitmap(s);
            for (x = 0; x < tImage.Width; x++)
            {
                for (y = 0; y < tImage.Height; y++)
                {

                    tImage.SetPixel(x, y, Color.FromArgb(alpha, tImage.GetPixel(x, y).R, tImage.GetPixel(x, y).G, tImage.GetPixel(x, y).B));
                }
            }
            return tImage;

        }
        public Form1()
        {
            InitializeComponent();
            trackBar1.TickStyle = TickStyle.Both;
            trackBar1.Orientation = Orientation.Vertical;
            trackBar1.Minimum = 0;
            trackBar1.Maximum = 255;
            trackBar1.Height = 101;
            trackBar1.Value = 255;
            pictureBox1.Image = Image.FromFile("C:\\Users\\rati\\Desktop\\water.jpg");
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        }
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            pictureBox1.Image = ChangeAlpha(pictureBox1.Image, trackBar1.Value);

            textBox1.Text = trackBar1.Value.ToString();

        }


    }
}
4

2 に答える 2

1
public Form1()
{
    ...
    originalImage = new Bitmap("C:\\Users\\rati\\Desktop\\water.jpg");
    pictureBox1.Image = originalImage;
    ...
}

// Add an extra field to the Form class.
Bitmap originalImage;

void trackBar1_Scroll(object sender, EventArgs e)
{
    pictureBox1.Image = ChangeAlpha((byte)trackBar1.Value);
    textBox1.Text = trackBar1.Value.ToString();
}

Image ChangeAlpha(byte alpha)
{
    Bitmap bmp = new Bitmap(originalImage);

    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);

    IntPtr ptr = bmpData.Scan0;

    int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
    byte[] rgbValues = new byte[bytes];

    Marshal.Copy(ptr, rgbValues, 0, bytes);

    // Set every fourth value to alpha. A 32bpp bitmap will change transparency.
    for (int counter = 3; counter < rgbValues.Length; counter += 4)
        rgbValues[counter] = alpha;

    // Also you can try parallelize loop.
    //int length = rgbValues.Length / 4;
    //Parallel.For(3, length, counter => rgbValues[counter * 4 - 1] = alpha);

    Marshal.Copy(rgbValues, 0, ptr, bytes);
    bmp.UnlockBits(bmpData);

    return bmp;
}
于 2015-11-18T17:21:41.387 に答える