解决方案 »
- 还是c#线程的问题,我开2个线程,如何让每个线程固定sleep60秒呢?
- c#调用和使用dll的问题
- ADO.NET中DataAdapter.Update()的问题
- 求Base64的解码! 支持者有分
- Winform中,在DataGridColumnStyle的单元格中怎么使用label控件??在线等待,解决马上给分
- 急!c# winform:如何在DataGrid最后一行中插入一条数据
- 请教如何从object 转换到string[] 数组?请看源码
- 雅蠛蝶,救命啊。。。ICSharpCode问题,路径访问被拒绝啊
- C#小菜求助!关于set,get
- 调研:当前大家正在用.NET构筑哪些商业系统
- ActiveX插件自动更新的问题,困扰很久,求助!
- 关于VS的版本
public double[] CMYKValue(Bitmap srcBitmap)
{
int w = srcBitmap.Width;
int h = srcBitmap.Height;
double[] imageData = new double[w * h * 4];
Bitmap dstBitmap = new Bitmap(srcBitmap.Width, srcBitmap.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
System.Drawing.Imaging.BitmapData srcData = srcBitmap.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
unsafe
{
byte* pIn = (byte*)srcData.Scan0.ToPointer();
byte* p;
int stride = srcData.Stride;
int r, g, b;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
p = pIn;
r = p[2];
g = p[1];
b = p[0];
imageData[x * 3 + y * w * 4] = (double)(g + b);
imageData[x * 3 + 1 + y * w * 4] = (double)(r + b);
imageData[x * 3 + 2 + y * w * 4] = (double)(r + g);
imageData[x * 3 + 3 + y * w * 4] = (double)(Math.Min((g + b), Math.Min((r + b), (r + g))));
pIn += 3;
}
pIn += srcData.Stride - w * 3;
}
srcBitmap.UnlockBits(srcData);
return imageData;
} }
/// <summary>
/// RGB to CMYK.
/// </summary>
/// <param name="rgbValue">RGB information.</param>
/// <param name="w">Width of image.</param>
/// <param name="h">Height of image.</param>
/// <returns></returns>
public static double[] RGBtoCMYK(byte[] rgbValue, int w, int h)
{
double[] cmykValue = new double[w * h * 4];
int r = 0, g = 0, b = 0;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
b = rgbValue[x * 3 + y * w * 3];
g = rgbValue[x * 3 + 1 + y * w * 3];
r = rgbValue[x * 3 + 2 + y * w * 3];
cmykValue[x * 3 + y * w * 4] = (double)(g + b);
cmykValue[x * 3 + 1 + y * w * 4] = (double)(r + b);
cmykValue[x * 3 + 2 + y * w * 4] = (double)(r + g);
cmykValue[x * 3 + 3 + y * w * 4] = (double)(Math.Min((g + b), Math.Min((r + b), (r + g))));
}
}
return cmykValue;
}
/// <summary>
/// CMYK to RGB.
/// </summary>
/// <param name="cmykValue">CMYK information.</param>
/// <param name="w">Width of image.</param>
/// <param name="h">Height of image.</param>
/// <returns></returns>
public static byte[] CMYKtoRGB(double[] cmykValue, int w, int h)
{
byte[] rgbValue = new byte[w * h * 3];
double cV = 0, mV = 0, yV = 0, kV = 0;
for (int j = 0; j < h; j++)
{
for (int i = 0; i < w; i++)
{
cV = cmykValue[i * 3 + j * w * 4];
mV = cmykValue[i * 3 + 1 + j * w * 4];
yV = cmykValue[i * 3 + 2 + j * w * 4];
kV = cmykValue[i * 3 + 3 + j * w * 4];
rgbValue[i * 3 + j * w * 3] = (byte)(0.5 * (mV + cV - yV));
rgbValue[i * 3 + 1 + j * w * 3] = (byte)(0.5 * (yV + cV - mV));
rgbValue[i * 3 + 2 + j * w * 3] = (byte)(0.5 * (mV + yV - cV));
}
}
return rgbValue;
}