Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Biến đổi ảnh màu sang ảnh xám trong lập trình C#

  1. #1
    Ngày gia nhập
    11 2010
    Bài viết
    21

    Angry Biến đổi ảnh màu sang ảnh xám trong lập trình C#

    Mọi người xem giúp em đoạn code sau sai chỗ nào mà nó không chuyển thành ảnh xám được.

    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace xu_ly_anh
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void openToolStripMenuItem_Click(object sender, EventArgs e)
            {
                openFileDialog1.Title = " Open file...";
                openFileDialog1.InitialDirectory = "D:\\";
                openFileDialog1.FileName = "";
                openFileDialog1.Filter = " Image file (*.BMP,*.JPG,*.JPEG)|*.bmp;*.jpg;*.jpeg ";
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                    pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);
            }
    
            private void saveToolStripMenuItem_Click(object sender, EventArgs e)
            {
                saveFileDialog1.Title = " Save file...";
                saveFileDialog1.InitialDirectory = "D:\\";
                saveFileDialog1.Filter = " Bitmap(*.BMP)|*.bmp|JPG (*.JPG)|*.jpg|JPEG (*.JPEG)|*.jpeg ";
                saveFileDialog1.OverwritePrompt = true;
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                    pictureBox1.Image.Save(saveFileDialog1.FileName);
    
    
            }
    
            private void grayLevelToolStripMenuItem_Click(object sender, EventArgs e)
            {
                Bitmap bm = new Bitmap(pictureBox1.Image);
                Rectangle rec = new Rectangle(0, 0, bm.Width, bm.Height);
                System.Drawing.Imaging.BitmapData bmData = bm.LockBits(rec, System.Drawing.Imaging.ImageLockMode.ReadWrite, bm.PixelFormat);
    
                int stride = bmData.Stride; 
                int nOffset = stride - bm.Width * 3;
            
                unsafe
                {
                    byte * p = (byte*) bmData.Scan0;
                    for (int y = 0; y < bm.Height; y++)
                    {
                        for (int x = 0; x < bm.Width; x++)
                        {
                            p[0] = p[1] = p[2] = (byte)(p[0] * 0.287 + p[1] * 0.559 + p[2] * 0.114);
                            p = p + 3;
                        }
                        p = p + nOffset;
                    }
                }
                bm.UnlockBits(bmData);
            }
        }
    }

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Ko nên lockbit của một bitmap trong c#. Tốt nhất là dùng phương thức GetPixel, SetPixel có sẵn của lớp bitmap, tuy hơi chậm một tí nhưng chắc chắn sẽ chạy được.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    08 2010
    Bài viết
    76

    Code:
    public static void xamhoa(Bitmap b)
            {
                Rectangle rec = new Rectangle(0, 0, b.Width, b.Height);
                BitmapData bdata = b.LockBits(rec, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                int stride = bdata.Stride;
                int nOffset = stride - b.Width * 3;
                IntPtr ptr = bdata.Scan0;
    
                unsafe
                {
                    byte* p = (byte*)ptr;
                    int x, y, red, green, blue, xam;
                    for (y = 0; y < b.Height; y++)
                    {
                        for (x = 0; x < b.Width; x++)
                        {
                            blue = p[0];
    
                            green = p[1];
    
                            red = p[2];
    
                            xam = (int)(red * 0.287 + green * 0.559 + blue * 0.114);
                            p[0] = (byte)(xam);
                            p[1] = (byte)(xam);
                            p[2] = (byte)(xam);
    
    
    
    
                            p += 3;
                        }
                        p += nOffset;
                    }
                }
    
                b.UnlockBits(bdata);
    
            }
    đây là code của mình. bạn tự so sánh nhé

  4. #4
    Ngày gia nhập
    05 2009
    Bài viết
    31

    Bạn chuot chui đã trả lời code rồi, còn mình có ý kiến về việc LockBits. Lý do khi sử dụng 2 hàm GetPixel, SetPixel chậm chính là vì mỗi lần gọi hàm đó thì nó lại thực hiện LockBits và UnlockBits. Nên việc LockBits khi cần đọc nhiều pixel trong ảnh là cần thiết. Nếu khuyên về việc sử dụng LockBits thì nhớ sau khi đọc xong thi phải UnlockBits.

  5. #5
    Ngày gia nhập
    08 2017
    Bài viết
    2

    Mặc định cách chỉnh video màu thành video xám như thế nào ạ? cứu e với :(((

    Trích dẫn Nguyên bản được gửi bởi ducvu153 Xem bài viết
    Bạn chuot chui đã trả lời code rồi, còn mình có ý kiến về việc LockBits. Lý do khi sử dụng 2 hàm GetPixel, SetPixel chậm chính là vì mỗi lần gọi hàm đó thì nó lại thực hiện LockBits và UnlockBits. Nên việc LockBits khi cần đọc nhiều pixel trong ảnh là cần thiết. Nếu khuyên về việc sử dụng LockBits thì nhớ sau khi đọc xong thi phải UnlockBits.
    cách chỉnh video màu thành video xám như thế nào ạ? cứu e với :(((

  6. #6
    Ngày gia nhập
    11 2013
    Bài viết
    467

    Mặc định Biến đổi ảnh màu sang ảnh xám trong lập trình C#

    Thuật toán của bạn bị sai. Đây là thuật toán chính xác nhất:
    Code:
    unsafe
    {
        byte*[] p = new byte*[bmData.Height]
        for(int y=0;y<bmData.Height;y++) p[y] = (byte*)bmData.Scan0.ToPointer() + y*bmData.Stride;
        int channels = bmData.Stride / bmData.Width;
        double gray=0;
        for (int y = 0; y < bm.Height; y++)
        {
             for (int px = 0; px < bm.Stride; x+=channels)
             {
                  gray = p[0] * 0.297 + p[1] * 0.589 + p[2] * 0.114;
                  p[px]=(byte)gray;
                  p[px+1]=(byte)gray;
                  p[px+2]=(byte)gray;
              }
         }
    }

Các đề tài tương tự

  1. Lỗi chương trình không nhận biến(không return được biến từ public sang main)
    Gửi bởi nang trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 4
    Bài viết cuối: 02-10-2011, 06:04 PM
  2. Thuộc tính khóa ngoài( tham chiếu) biến mất khi biến đổi từ file XML sang DataTable
    Gửi bởi itmanhieu trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 17-08-2011, 08:02 PM
  3. Biến đổi một mảng sang nhị phân, hexa trong C#?
    Gửi bởi hirameki trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 02-08-2011, 09:54 AM
  4. Hiển thị giá trị của biến trong form này sang textbox của form khác
    Gửi bởi hades259 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 01-05-2011, 01:33 PM
  5. miêu tả tình trạng của Queue trong biến đổi 1 số từ hệ 10 sang hệ 2
    Gửi bởi mrduc_pc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 01-04-2011, 01:50 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn