WPF程序:图像的ARGB数字矩阵输出。发现某些像素点结果不正确。谁帮忙看看哪里出了问题?

问题描述

代码如下,运行即可。<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();

时间: 2024-10-28 18:00:37

WPF程序:图像的ARGB数字矩阵输出。发现某些像素点结果不正确。谁帮忙看看哪里出了问题?的相关文章

关于WPF程序在win7系统下不能打印控件的问题

问题描述 RT,最近到客户现场实施发现WPF程序在win7系统下打印控件为空,也就是打印机打印出来的是白纸,啥都没有,在win8系统下可以打印内容,有人遇到过这个问题么? 解决方案 解决方案二:没遇到过.你可以试试写一个最简单的wpf程序,为用户更新一下打印机驱动,或者给打印机换墨.难道你的wpf程序在开发测试中就从来没有在win7下测试过,跑到用户那里测试么?解决方案三:如果你们的程序在公司和别的用户那里在win7系统下已经测试过,作为一个技术服务人员,应该想到的是有问题的那个范围的东西,纠结

代码-新手求问wpf程序中关于路由事件的问题

问题描述 新手求问wpf程序中关于路由事件的问题 我放了两个Button控件 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Grid1.AddHandler(Button.ClickEvent,new RoutedEventHandler(onClick)); } public void onClick(object sender, RoutedEventArgs e

新手求助,请问怎么用c#form 去打开一个c语言程序,并且通过c#向这个程序输入,并且获得输出

问题描述 假如我有一个c语言程序#include<string.h>#include<stdio.h>intmain(){chara[100];while(1){printf("请输入字符串:");scanf("%s",a);printf("%sn",a);}return0;}这是一个死循环,我想从c#的form来控制这个程序,我开始用process,发现必须要等这个程序结束了才能输出,但是这个是死循环,怎么确保这两个程序

WPF程序将DLL嵌入到EXE的两种方法

原文:WPF程序将DLL嵌入到EXE的两种方法 WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了>可以参看地下地址(两篇是一样的): 开源中国 http://my.oschina.net/chinesedragon/blog/308336 CNBLOGS http://www.cnblogs.com/luoshupeng/p/3946635.html

VS中模仿WPF模板创建最简单的WPF程序_C#教程

如果不用VS的WPF项目模板,如何手工创建一个WPF程序呢?我们来模仿WPF模板,创建一个最简单的WPF程序. 第一步:文件--新建--项目--空项目,创建一个空项目. 第二步:添加引用,PresentationFramework,PresentationCore,WindowsBase,System,System.Xaml,这几个是WPF的核心dll. 第三步:在项目上右键添加新建项,添加两个"xml文件",分别命名为App.xaml和MainWindow.xaml.可以看出,xam

wpf程序,由于引用了Viewport3D、Viewport2DVisual3D和灯光等,导致在运行过程中,偶尔出现Dwrite.dll底层报错

问题描述 是这样的,我的wpf程序,界面有一个圆柱模型,图片在模型旋转,程序运行过程中,设置电脑分辨率,造成无法捕捉的crash:错误应用程序名称:MyWard.vshost.exe,版本:12.0.30723.0,时间戳:0x53cf4fe5错误模块名称:dwrite.dll,版本:6.1.7601.17514,时间戳:0x4ce7b817异常代码:0xc0000005错误偏移量:0x0005d318错误进程ID:0x17e8错误应用程序启动时间:0x01d1cb65b64eacf1错误应用程

网络编程-用socket写了个linux聊天的小程序,一客户端一直输出接受消息成功 ==

问题描述 用socket写了个linux聊天的小程序,一客户端一直输出接受消息成功 == //服务器端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<mallo

wpf-kinect写的WPF程序是否可以加个“皮肤”?

问题描述 kinect写的WPF程序是否可以加个"皮肤"? 用C#写了个Kinect姿势识别的程序,觉得显示火柴棍不太好看,想加个皮肤,有没有大神能指个路啊~~~关键字什么的 试过Unity3D,觉得太小题大做了.所以就想知道能不能直接在WPF的基础上做个2D的出来.

如何在WPF程序中使用ArcGIS Engine的控件

原文 http://www.gisall.com/html/47/122747-4038.html WPF(Windows Presentation Foundation)是美国微软公司推出.NET Framework 3.0的组成部分之一,它是一套基于XML..NET Framework.矢量绘图(vector graphic)技术的展示层(presentation layer)开发框架,微软视其为下一代用户界面(user interface)技术,将广泛被用于下一代的Windows平台(Wi