问题描述
代码如下,运行即可。<Windowx:Class="Test.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow"Height="700"Width="700"Background="Green"><Grid><TextBlockName="TB"></TextBlock></Grid></Window>
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Media.Imaging;usingSystem.Windows.Navigation;usingSystem.Windows.Shapes;namespaceTest{///<summary>///InteractionlogicforMainWindow.xaml///</summary>publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();BitmapImagebi=newBitmapImage(newUri("D:\03.png"));byte[]b=newbyte[4*bi.PixelWidth*bi.PixelHeight];Int32Rectrect=newInt32Rect(0,0,bi.PixelWidth,bi.PixelHeight);bi.CopyPixels(rect,b,bi.PixelWidth*4,0);for(inti=1;i<=bi.PixelHeight;i++){for(intj=1;j<=bi.PixelWidth;j++){intz=4*(i-1)*bi.PixelWidth+4*(j-1);this.TB.Text+=(b[z+0]+"、"+b[z+1]+"、"+b[z+2]+"、"+b[z+3]+"、");}this.TB.Text+="rn";}}}}
解决方案
本帖最后由 bdssckwpf 于 2012-03-19 14:42:26 编辑
解决方案二:
大家是否看得明白输出的结果?大家可以用一些小图片来测试一下,输出结果就很直观了。尽量用较小的图片:如5*5,6*6,7*7等等。
解决方案三:
求大牛一定要帮忙调调。我要做一个小型的图片编辑的软件,因此,要精确地获取图像的像素值。现在第一步就出现坎了:读取进来的图像的像素值,与原图像不相符。
解决方案四:
有人能回复一下吗?
解决方案五:
bi.CopyPixels(rect,b,bi.PixelWidth*4,0);bi.CopyPixels(rect,b,bi.PixelWidth*bi.PixelHeight*4,0);copy错了吧
解决方案六:
引用4楼startstartsvip的回复:
bi.CopyPixels(rect,b,bi.PixelWidth*4,0);bi.CopyPixels(rect,b,bi.PixelWidth*bi.PixelHeight*4,0);copy错了吧
不对,我说错了那个是stride有人也用bi.PixelWidth*((bi.Format.BitsPerPixel+7)/8)
解决方案七:
我电脑上都是一样的应该是你图片的问题BitsPerPixelBitmapImagebi=newBitmapImage(newUri(@"C:UsersLionHeartPicturesrb.png"));byte[]b=newbyte[4*bi.PixelWidth*bi.PixelHeight];Int32Rectrect=newInt32Rect(0,0,bi.PixelWidth,bi.PixelHeight);bi.CopyPixels(bi.SourceRect,b,bi.Format.BitsPerPixel*bi.PixelWidth/8,0);Bitmaptarge=newBitmap(bi.PixelWidth,bi.PixelHeight);MemoryStreamms=newMemoryStream(b);BinaryReadersr=newBinaryReader(ms);for(inti=0;i<bi.PixelHeight;i++){for(intj=0;j<bi.PixelWidth;j++){targe.SetPixel(j,i,Color.FromArgb(sr.ReadInt32()));}}sr.Close();ms.Close();pictureBox1.Image=targe;
解决方案八:
我的图片应该是没有问题的吧,都是用photoshop制作的。你试试用photoshop制作一幅3*3的png图片,然后,给这9个点,分别给予不通的颜色,再用我这个程序调试来看看?就简单的9个点,就会发现,读取进来的ARGB值,其中怎么也有两三个点,是有偏差的。引用6楼startstartsvip的回复:
我电脑上都是一样的应该是你图片的问题BitsPerPixelC#codeBitmapImagebi=newBitmapImage(newUri(@"C:UsersLionHeartPicturesrb.png"));byte[]b=newbyte[4*bi.PixelWidth*bi.Pixel……
解决方案九:
察看了一下是因为存成bytesARGB,在字节里是little-endian就是说是BGRAthis.TB.Text+=(b[z+0]+"、"+b[z+1]+"、"+b[z+2]+"、"+b[z+3]+"、");BGRA用BinaryReadersr=newBinaryReader(ms);sr.ReadInt32()就可以得到正确值你可以用下面的方法验证:targe.SetPixel(j,i,Color.FromArgb(sr.ReadInt32()));Colorc=targe.GetPixel(j,i);
解决方案十:
我用你的方法:SetPixel(j,i,Color.FromArgb(sr.ReadInt32()));得到的,和我的程序得到的,是一致的结果。例如某个像素本来是:(121,200,189,255),最后读入后,却变成了(120,201,191,255).用SetPixel(j,i,Color.FromArgb(sr.ReadInt32()));也是一样有偏差。我猜是因为图像是用photoshop生成的缘故,因为我用画图工具来生成图片,就没有出过问题。引用8楼startstartsvip的回复:
察看了一下是因为存成bytesARGB,在字节里是little-endian就是说是BGRAthis.TB.Text+=(b[z+0]+"、"+b[z+1]+"、"+b[z+2]+"、"+b[z+3]+"、");B……
解决方案十一:
argb和bgra的细节,我是知道的。不知道你那里有没有photoshop软件,有的话,可以用photoshop建一幅3*3的图片来测试。不要用windows自带的画图软件,因为这个软件生成的图片,经过测试,是没有问题的。我想问题的关键点就是:图片是photoshop生成的。至于原因,我就不知道为什么了。引用8楼startstartsvip的回复:
察看了一下是因为存成bytesARGB,在字节里是little-endian就是说是BGRAthis.TB.Text+=(b[z+0]+"、"+b[z+1]+"、"+b[z+2]+"、"+b[z+3]+"、");B……
解决方案十二:
cs4png画了三条纯RGB色彩带读入没有问题,没有一点误差
解决方案十三:
这幅图片,是腾讯主页上的logo的地址(你可以直接去腾讯首页拿下来),如下:http://mat1.gtimg.com/www/iskin960/qqcomlogo.png你用这幅图片测试,试试看。在我这里测试,就有偏差。引用11楼startstartsvip的回复:
cs4png画了三条纯RGB色彩带读入没有问题,没有一点误差
解决方案十四:
我好像找到了原因了:用windows画图工具制作的png图片,格式是bgr32。用photoshopCS5制作的png图片,格式是bgra32。而腾讯的logo图片,格式是Indexed8。是不是因为虽然都是png图片,但色彩模型不一样,因此,读取argb值就需要用不同的方法?引用11楼startstartsvip的回复:
cs4png画了三条纯RGB色彩带读入没有问题,没有一点误差
解决方案十五:
哦原来这样啊
解决方案:
解决方法已经找到:使用如下方法,载入图片即可:BitmapImagebi=newBitmapImage();bi.BeginInit();bi.CreateOptions=BitmapCreateOptions.IgnoreColorProfile;bi.UriSource=newUri("D:\03.png");bi.EndInit();