2012-03-26 30 views
6

Tôi có 28 hình ảnh có 3 kích thước mỗi (84 tổng) tất cả đều là đơn sắc với các lớp alpha khác nhau để làm cho mỗi hình ảnh. Tôi muốn làm cho mỗi người trong số họ có sẵn trong 5 màu sắc khác nhau. tổng số 420 ảnh. Điều này rõ ràng sẽ là một nỗi đau lớn để làm bằng tay. Tôi không có Photoshop vì vậy bất kỳ loại chức năng photoshop không phải là một câu trả lời hợp lệ. Tôi có Paint.NET nhưng điều chỉnh màu sắc không làm việc cho tôi bởi vì thay đổi màu sắc một mình không cho tôi những màu sắc mà tôi muốn.Làm cách nào để bạn chỉnh sửa tệp .png theo lập trình?

Về cơ bản những gì tôi cần làm là cho mỗi điểm ảnh trong hình ảnh, lấy giá trị RGBA và thay thế RGB bằng giá trị RGB mới và giữ nguyên giá trị A.

Bất kỳ ai biết cách thực hiện việc này? Tôi không có may mắn tìm kiếm trên StackOverflow hoặc Google (có thể sử dụng các thuật ngữ tìm kiếm sai).

Tôi thích câu trả lời trong C# hoặc VB.NET nhưng nếu có ai biết cách thực hiện điều này bằng bất kỳ ngôn ngữ nào thì tôi có thể áp dụng nó cho C# hoặc VB.NET.

--Edit--

Trong trường hợp có ai tìm thấy này và đang tìm kiếm câu trả lời, đây là những gì tôi đã dựa trên các liên kết từ Yorye Nathan.

private const int RED = 51; 
private const int GREEN = 181; 
private const int BLUE = 229; 

private const int NEW_RED = 170; 
private const int NEW_GREEN = 102; 
private const int NEW_BLUE = 204; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
    { 

    Image OriginalImage = Image.FromFile(openFileDialog1.FileName); 
    Image NewImage = ColorFilter(OriginalImage); 

    pictureBox1.Image = OriginalImage; 
    pictureBox2.Image = NewImage; 
    } 

} 

public static Image ColorFilter(Image originalImage) 
{ 
    Bitmap newImage = new Bitmap(originalImage); 
    BitmapData originalData = (originalImage as Bitmap).LockBits(new Rectangle(0, 0, originalImage.Width, originalImage.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

    BitmapData newData = (newImage as Bitmap).LockBits(new Rectangle(0, 0, originalImage.Width, originalImage.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 

    int originalStride = originalData.Stride; 
    System.IntPtr originalScan0 = originalData.Scan0; 

    int newStride = newData.Stride; 
    System.IntPtr newScan0 = newData.Scan0; 

    unsafe 
    { 
    byte* pOriginal = (byte*)(void*)originalScan0; 
    byte* pNew = (byte*)(void*)newScan0; 

    int nOffset = originalStride - originalImage.Width * 4; 

    byte red, green, blue; 

    for (int y = 0; y < originalImage.Height; ++y) 
    { 
     for (int x = 0; x < originalImage.Width; ++x) 
     { 
     blue = pOriginal[0]; 
     green = pOriginal[1]; 
     red = pOriginal[2]; 

     if (pOriginal[0] == BLUE && pOriginal[1] == GREEN && pOriginal[2] == RED) 
     { 
      pNew[0] = (byte)NEW_BLUE; 
      pNew[1] = (byte)NEW_GREEN; 
      pNew[2] = (byte)NEW_RED; 
     } 

     pOriginal += 4; 
     pNew += 4; 
     } 
     pOriginal += nOffset; 
     pNew += nOffset; 
    } 
    } 
    (originalImage as Bitmap).UnlockBits(originalData); 
    (newImage as Bitmap).UnlockBits(newData); 
    return newImage; 
} 
+1

Tôi đã chạy mã đó (với một vài chỉnh sửa, như lặp qua tất cả hình ảnh trong thư mục đã chọn và thay đổi đường dẫn đầu ra) và tạo tất cả 420 hình ảnh trong một giây. Lao động thủ công là dành cho suckers. – Nick

Trả lời

4

Kiểm tra điều này question. Tinh chỉnh một chút với các bit của pixel thay thế để làm cho nó thêm chúng thay vì thay thế chúng, và bạn tốt để đi.

+0

Cảm ơn, đó là chính xác những gì tôi cần. Tôi đã cập nhật câu hỏi và đăng giải pháp của mình trong trường hợp bất kỳ ai khác bắt gặp điều này trong tìm kiếm. – Nick

+0

Tuyệt vời, chúc may mắn :) – SimpleVar

Các vấn đề liên quan