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;
}
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