Silverlight ImageTools.IO.Jpeg.JpegDecoder质量不佳

时间:2011-09-05 19:45:47

标签: c# silverlight image-processing jpeg

我正在使用ImageTools for Silverlight加载JPG图像,但解码后的图像质量为BAD(无抗锯齿,请参见红色方块中的第二个图像)。

这是我的代码:

OpenFileDialog dlg = new OpenFileDialog();

if (dlg.ShowDialog() == true)
{
    var stream = dlg.File.OpenRead();
    var newImg = new ExtendedImage(); // ExtendedImage is a ImageTools Api class
    var d= new ImageTools.IO.Jpeg.JpegDecoder();
    d.Decode(newImg, stream);
    image1.Source = newImg.ToBitmap(); //image1 is a System.Windows.Controls.Image
}

源图像

this is the source image

结果不好

this is the bad result

观察

如果我将image1.source直接设置为原始图片中的网址,则图片会正确呈现!

这是ImageTools API中的错误吗?

The problem is posted on Codeplex,但它没有任何答案。

如果我重写代码,我会得到相同的结果。

XAML

<UserControl x:Class="JPGDecoder.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
    <Image Height="120" HorizontalAlignment="Left" Margin="46,75,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="160" Source="/JPGDecoder;component/Images/org.jpg" />
    <Image Height="120" HorizontalAlignment="Left" Margin="212,75,0,0" Name="image2" Stretch="Fill" VerticalAlignment="Top" Width="160" />
    <Button Content="Decode JPG from File Stream" Height="23" HorizontalAlignment="Left" Margin="44,25,0,0" Name="button1" VerticalAlignment="Top" Width="192" Click="button1_Click" />
</Grid>

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using ImageTools;

namespace JPGDecoder
{
public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        var dlg = new OpenFileDialog();

        if (dlg.ShowDialog()==true)
        {
            var stream = dlg.File.OpenRead();
            var newImg = new ExtendedImage();
            var d = new ImageTools.IO.Jpeg.JpegDecoder();
            d.Decode(newImg, stream);
            image2.Source = newImg.ToBitmap();
        }
    }
}
}

结果

enter image description here

2 个答案:

答案 0 :(得分:0)

嗯......我认为如果你向ImageTool codeplex forum发帖提问是个好主意,这位作者以前的答案非常快。

您是否检查过他的网站上的样本?

通常我对这个库没有任何问题。

干杯   布劳略

答案 1 :(得分:0)

ImageTools不支持antialising,所以我从Subversion获得了FJCore并运行了示例应用程序。

  1. 首先测试结果相同,质量差。
  2. 查看源代码,我找到了这个代码块:

    // Resize
    DecodedJpeg jpegOut = new DecodedJpeg(
        new ImageResizer(jpegIn.Image).Resize(320, ResamplingFilters.NearestNeighbor),
        jpegIn.MetaHeaders); // Retain EXIF details
    

    并将其更改为:

    //Resize
    DecodedJpeg jpegOut = new DecodedJpeg(
        new ImageResizer(jpegIn.Image).Resize(320, ResamplingFilters.LowpassAntiAlias),
        jpegIn.MetaHeaders); // Retain EXIF details
    
  3. 这是解决方案: ResamplingFilters.LowpassAntiAlias

    谢谢大家!!