superhackerzhan 发表于 2010-4-13 10:22:00

Carl 发表于 2010-4-13 11:10:00

使用System.Drawing.Bitmap类型,在构造函数中传入JPEG的文件名或者二进制流,然后使用GetPixel
方法循环查询每个点的颜色。Bitmap类型会自动使用JPEG解码器对图片解码。

这个方法性能一般,如果没有特殊的需求,应该够用了。

superhackerzhan 发表于 2010-4-13 11:13:00

winking 发表于 2010-4-13 20:54:00

原帖由 Carl 于 2010-4-13 11:10:00 发表
使用System.Drawing.Bitmap类型,在构造函数中传入JPEG的文件名或者二进制流,然后使用GetPixel
方法循环查询每个点的颜色。Bitmap类型会自动使用JPEG解码器对图片解码。

这个方法性能一般,如果没有特殊的需求,应该够用了。

要求比较高的时候可以通过LockBits来获得Bitmap在内存中的数据,然后可以通过unsafe代码或者Marshal来直接操作内存数据以高效修改图像。
MSDN示例:http://msdn.microsoft.com/zh-cn/library/5ey6h79d%28v=VS.80%29.aspx

superhackerzhan 发表于 2010-4-17 16:08:00

superhackerzhan 发表于 2010-4-23 21:51:00

superhackerzhan 发表于 2010-4-23 21:54:00

superhackerzhan 发表于 2010-4-24 11:10:00

winking 发表于 2010-4-24 22:45:00

BitmapData bmpData2 = bitmap2.LockBits(rect2, ImageLockMode.ReadOnly,bitmap2.PixelFormat);
IntPtr ptr2 = bmpData2.Scan0;
int size2 = bitmap2.Width * bitmap2.Height * 3;
byte[] rgbvalue2 = new byte;
       
System.Runtime.InteropServices.Marshal.Copy(ptr2, rgbvalue2, 0, size2);


你这里做的假设有问题,并不是所有图片的存储都是RGB的,你需要根据PixelFormat来判断。
比较常用的是这两个:
PixelFormat24bppRGB:
Specifies that the format is 24 bits per pixel; 8 bits each are used for the red, green, and blue components.

PixelFormat32bppARGB:
Specifies that the format is 32 bits per pixel; 8 bits each are used for the alpha, red, green, and blue components.

按照你的实现,如果图片不是24bits的,那么肯定无法通过Memory Copy的。

你可以试试监视当时的PixelFormat,甚至直接通过内存窗口查看当时的内存情况。

superhackerzhan 发表于 2010-4-26 10:10:00

页: [1] 2
查看完整版本: CARL请教一个问题