C# 为什么IrfanView说我的jpg文件是png文件?
我的工具应该调整.jpg或.png文件的大小 在一个我没有安装IrfanView的地方,它似乎可以正常工作。但在家里,当我打开一个*.jpg并将其保存为已调整大小时,我看到: 但是,无论在对话框中选择“是”还是“否”,图像在任何情况下都显示良好 瞧,我可以加载和保存JPG和PNG,它们也可以这样保存,并且显示良好。但IrfanView声称他们搞砸了 实际上,我不确定图像是如何保存的;我假设它只是根据扩展以适当的格式保存在后台。无论如何,由于这是一个相当简单的实用程序,我将只显示所有代码:C# 为什么IrfanView说我的jpg文件是png文件?,c#,image,png,jpeg,irfanview,C#,Image,Png,Jpeg,Irfanview,我的工具应该调整.jpg或.png文件的大小 在一个我没有安装IrfanView的地方,它似乎可以正常工作。但在家里,当我打开一个*.jpg并将其保存为已调整大小时,我看到: 但是,无论在对话框中选择“是”还是“否”,图像在任何情况下都显示良好 瞧,我可以加载和保存JPG和PNG,它们也可以这样保存,并且显示良好。但IrfanView声称他们搞砸了 实际上,我不确定图像是如何保存的;我假设它只是根据扩展以适当的格式保存在后台。无论如何,由于这是一个相当简单的实用程序,我将只显示所有代码: usi
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace FileResizingUtil
{
public partial class FormFileResizer : Form
{
private Image _imgToResize;
String _originalFilename = String.Empty;
public FormFileResizer()
{
InitializeComponent();
}
private void buttonChooseImage_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog
{
InitialDirectory = "c:\\",
Filter = "JPG files (*.jpg)|*.jpg| PNG files (*.png)|*.png", FilterIndex = 2, RestoreDirectory = true
};
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
_originalFilename = ofd.FileName;
_imgToResize = Image.FromFile(_originalFilename);
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}
// If made it to here, it must be good
String preamble = labelImgSelected.Text;
labelImgSelected.Text = String.Format("{0}{1}", preamble, _originalFilename);
textBoxOrigHeight.Text = _imgToResize.Height.ToString();
textBoxOrigWidth.Text = _imgToResize.Width.ToString();
buttonApplyPercentageChange.Enabled = true;
//buttonResizeImage.Enabled = true;
}
private void buttonResizeImage_Click(object sender, EventArgs e)
{
// Really large images take awhile, so show an hourglass
Cursor.Current = Cursors.WaitCursor;
try
{
var size = new Size { Height = Convert.ToInt32(textBoxNewHeight.Text), Width = int.Parse(textBoxNewWidth.Text) };
// Two different ways of getting the int val
Image resizedImg = FileResizeUtils.GetResizedImage(_imgToResize, size);
String fileNameSansExtension = Path.GetFileNameWithoutExtension(_originalFilename);
String fileNameExtension = Path.GetExtension(_originalFilename);
String newFilename = String.Format("{0}{1}_{2}{3}", fileNameSansExtension, size.Height, size.Width, fileNameExtension);
// If used a different extension (jpg where the original was png, or vice versa) would the Save be intelligent enough to actually save in the other format?
resizedImg.Save(newFilename);
MessageBox.Show(String.Format("Done! File saved as {0}", newFilename));
Recycle();
}
finally
{
Cursor.Current = Cursors.Default;
}
}
private void Recycle()
{
buttonResizeImage.Enabled = false;
buttonApplyPercentageChange.Enabled = false;
labelImgSelected.Text = "Image selected: ";
textBoxOrigHeight.Text = String.Empty;
textBoxOrigWidth.Text = String.Empty;
// Retain the percentage vals, as it may be that all in a batch need to be the same pair of vals
}
private void buttonApplyPercentageChange_Click(object sender, EventArgs e)
{
int origHeight = _imgToResize.Height;
int origWidth = _imgToResize.Width;
// Two ways to convert the val
double heightFactor = (double)numericUpDownHeight.Value / 100.0;
double widthFactor = Convert.ToDouble(numericUpDownWidth.Value) / 100.0;
if (heightFactor < 0 || widthFactor < 0)
{
// show an error - no negative values allowed- using updown, so that should not be possible
}
var newHeight = Convert.ToInt32(origHeight * heightFactor);
var newWidth = Convert.ToInt32(origWidth * widthFactor);
textBoxNewHeight.Text = newHeight.ToString();
textBoxNewWidth.Text = newWidth.ToString();
buttonResizeImage.Enabled = true;
}
private void textBoxNewHeight_TextChanged(object sender, EventArgs e)
{
EnableResizeButtonIfValidDimensionsEntered();
}
private void EnableResizeButtonIfValidDimensionsEntered()
{
if (String.IsNullOrWhiteSpace(textBoxOrigHeight.Text)) return;
String candidateHeight = textBoxNewHeight.Text;
String candidateWidth = textBoxNewWidth.Text;
int validHeight;
int validWidth;
buttonResizeImage.Enabled = (int.TryParse(candidateHeight, out validHeight)) &&
(int.TryParse(candidateWidth, out validWidth));
}
private void numericUpDownHeight_ValueChanged(object sender, EventArgs e)
{
if (checkBoxRetainRatio.Checked)
{
numericUpDownWidth.Value = numericUpDownHeight.Value;
}
}
private void numericUpDownWidth_ValueChanged(object sender, EventArgs e)
{
if (checkBoxRetainRatio.Checked)
{
numericUpDownHeight.Value = numericUpDownWidth.Value;
}
}
}
}
更新2
下面是我的新代码,实现了建议,并支持几种新的文件类型:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;
namespace FileResizingUtil
{
public partial class FormFileResizer : Form
{
private Image _imgToResize;
String _originalFilename = String.Empty;
public FormFileResizer()
{
InitializeComponent();
}
private void buttonChooseImage_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog
{
InitialDirectory = "c:\\",
Filter = "JPG files (*.jpg)|*.jpg| PNG files (*.png)|*.png| BMP files (*.bmp)|*.bmp| TIFF files (*.tiff)|*.png| ICO files (*.ico)|*.ico| EMF files (*.emf)|*.emf| WMF files (*.wmf)|*.wmf",
FilterIndex = 1, RestoreDirectory = true
};
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
_originalFilename = ofd.FileName;
_imgToResize = Image.FromFile(_originalFilename);
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}
if (String.IsNullOrWhiteSpace(_originalFilename)) return;
// If made it to here, it must be good
String preamble = labelImgSelected.Text;
labelImgSelected.Text = String.Format("{0}{1}", preamble, _originalFilename);
textBoxOrigHeight.Text = _imgToResize.Height.ToString();
textBoxOrigWidth.Text = _imgToResize.Width.ToString();
buttonApplyPercentageChange.Enabled = true;
}
private void buttonResizeImage_Click(object sender, EventArgs e)
{
bool success = true;
// Really large images take awhile, so show an hourglass
Cursor.Current = Cursors.WaitCursor;
try
{
// Two different ways of getting the int val
var size = new Size { Height = Convert.ToInt32(textBoxNewHeight.Text), Width = int.Parse(textBoxNewWidth.Text) };
Image resizedImg = FileResizeUtils.GetResizedImage(_imgToResize, size);
String fileNameSansExtension = Path.GetFileNameWithoutExtension(_originalFilename);
String fileNameExtension = Path.GetExtension(_originalFilename);
String newFilename = String.Format("{0}{1}_{2}{3}", fileNameSansExtension, size.Height, size.Width, fileNameExtension);
if (fileNameExtension != null && fileNameExtension.ToLower().Contains("jpg"))
{
resizedImg.Save(newFilename, ImageFormat.Jpeg);
}
else if (fileNameExtension != null && fileNameExtension.ToLower().Contains("png"))
{
resizedImg.Save(newFilename, ImageFormat.Png);
}
else if (fileNameExtension != null && fileNameExtension.ToLower().Contains("bmp"))
{
resizedImg.Save(newFilename, ImageFormat.Bmp);
}
else if (fileNameExtension != null && fileNameExtension.ToLower().Contains("ico"))
{
resizedImg.Save(newFilename, ImageFormat.Icon);
}
else if (fileNameExtension != null && fileNameExtension.ToLower().Contains("tiff"))
{
resizedImg.Save(newFilename, ImageFormat.Tiff);
}
else if (fileNameExtension != null && fileNameExtension.ToLower().Contains("emf"))
{
resizedImg.Save(newFilename, ImageFormat.Emf);
}
else if (fileNameExtension != null && fileNameExtension.ToLower().Contains("wmf"))
{
resizedImg.Save(newFilename, ImageFormat.Wmf);
}
else
{
success = false;
}
MessageBox.Show(success
? String.Format("Done! File saved as {0}", newFilename)
: "Something went awry. The file was not saved");
Recycle();
}
finally
{
Cursor.Current = Cursors.Default;
}
}
private void Recycle()
{
buttonResizeImage.Enabled = false;
buttonApplyPercentageChange.Enabled = false;
labelImgSelected.Text = "Image selected: ";
textBoxOrigHeight.Text = String.Empty;
textBoxOrigWidth.Text = String.Empty;
// Retain the percentage vals, as it may be that all in a batch need to be the same pair of vals
}
private void buttonApplyPercentageChange_Click(object sender, EventArgs e)
{
int origHeight = _imgToResize.Height;
int origWidth = _imgToResize.Width;
// Two ways to convert the val
double heightFactor = (double)numericUpDownHeight.Value / 100.0;
double widthFactor = Convert.ToDouble(numericUpDownWidth.Value) / 100.0;
if (heightFactor < 0 || widthFactor < 0)
{
// show an error - no negative values allowed- using updown, so that should not be possible
}
var newHeight = Convert.ToInt32(origHeight * heightFactor);
var newWidth = Convert.ToInt32(origWidth * widthFactor);
textBoxNewHeight.Text = newHeight.ToString();
textBoxNewWidth.Text = newWidth.ToString();
buttonResizeImage.Enabled = true;
}
private void textBoxNewHeight_TextChanged(object sender, EventArgs e)
{
EnableResizeButtonIfValidDimensionsEntered();
}
private void EnableResizeButtonIfValidDimensionsEntered()
{
if (String.IsNullOrWhiteSpace(textBoxOrigHeight.Text)) return;
String candidateHeight = textBoxNewHeight.Text;
String candidateWidth = textBoxNewWidth.Text;
int validHeight;
int validWidth;
buttonResizeImage.Enabled = (int.TryParse(candidateHeight, out validHeight)) &&
(int.TryParse(candidateWidth, out validWidth));
}
private void numericUpDownHeight_ValueChanged(object sender, EventArgs e)
{
if (checkBoxRetainRatio.Checked)
{
numericUpDownWidth.Value = numericUpDownHeight.Value;
}
}
private void numericUpDownWidth_ValueChanged(object sender, EventArgs e)
{
if (checkBoxRetainRatio.Checked)
{
numericUpDownHeight.Value = numericUpDownWidth.Value;
}
}
}
}
从图像。保存:
如果图像的文件格式不存在编码器,则便携式
使用网络图形PNG编码器。当您使用Save方法时
将图形图像保存为Windows图元文件格式WMF或增强型
图元文件格式EMF文件,生成的文件保存为可移植文件
网络图形PNG文件。发生这种行为是因为GDI+
.NET Framework的组件没有您可以使用的编码器
用于将文件另存为.wmf或.emf文件
如果要以其他格式保存,请使用重载保存方法,将格式作为第二个参数:
Save(String, ImageFormat)
从图像。保存:
如果图像的文件格式不存在编码器,则便携式
使用网络图形PNG编码器。当您使用Save方法时
将图形图像保存为Windows图元文件格式WMF或增强型
图元文件格式EMF文件,生成的文件保存为可移植文件
网络图形PNG文件。发生这种行为是因为GDI+
.NET Framework的组件没有您可以使用的编码器
用于将文件另存为.wmf或.emf文件
如果要以其他格式保存,请使用重载保存方法,将格式作为第二个参数:
Save(String, ImageFormat)
大多数图像查看器不使用文件的扩展名来确定文件的类型,而是使用所谓的幻数。他们基本上检查文件的前X字节,这通常是特定图像格式所特有的
我的猜测是,您正在使用的库将文件保存为PNG作为默认编辑:请参见Eugenes答案,而不考虑您在其中放置的扩展名。IrfanView注意到,幻数和扩展名不匹配,但仍然通过默认的幻数显示图像。大多数图像查看器不使用文件扩展名来确定文件类型,而是使用所谓的幻数。他们基本上检查文件的前X字节,这通常是特定图像格式所特有的
我的猜测是,您正在使用的库将文件保存为PNG作为默认编辑:请参见Eugenes答案,而不考虑您在其中放置的扩展名。IrfanView注意到,幻数和扩展名不匹配,但仍然通过默认的幻数显示图像。转到控制台并打印出文件。如果它是PNG文件,您将看到PNG显示并停止 如果是JPEG,你会得到很多垃圾,但应该在顶部看到EXIF或JFIF。最开始是FF D8 由于JPEG和PNG具有不同的签名,应用程序可以将其与内容区分开来,并邀请适当的解码器
图像应用程序通常根据流的内容而不是扩展名来识别图像的类型。转到控制台并打印出文件。如果它是PNG文件,您将看到PNG显示并停止 如果是JPEG,你会得到很多垃圾,但应该在顶部看到EXIF或JFIF。最开始是FF D8 由于JPEG和PNG具有不同的签名,应用程序可以将其与内容区分开来,并邀请适当的解码器
图像应用程序通常根据流的内容而不是扩展来识别图像的类型。那么您有什么问题?文件扩展名是约定;InfranView警告您,您正在打开的图像不符合使用jpg扩展名的约定,而文件实际上是pngIt,并且我的jpg是png。但是扩展名为.jpg的文件显示得很好。通常,不正确的扩展名会导致文件根本无法加载,或导致喀拉喀托爆发,或导致类似情况。所以我认为它真的是一个jpg文件,为什么IrfanView认为它是一个png?因为它是一个png。它刚刚被重命名为jpg,显然Krakatoa使用扩展来确定它是什么图像类型,这是一种糟糕的方式。不,尽管上面有尖叫镜头,但即使我加载/保存jpg时也会发生这种情况。那么你的问题是什么?文件扩展名是约定;InfranView警告您,您正在打开的图像不符合使用jpg扩展名的约定
当文件实际上是pngIt时,我会说我的jpg是png。但是扩展名为.jpg的文件显示得很好。通常,不正确的扩展名会导致文件根本无法加载,或导致喀拉喀托爆发,或导致类似情况。所以我认为它真的是一个jpg文件,为什么IrfanView认为它是一个png?因为它是一个png。它刚刚被重命名为jpg,显然Krakatoa使用扩展来确定它是什么图像类型,这是一种糟糕的方式。不,尽管上面有尖叫镜头,但即使我加载/保存jpg时也会发生这种情况。但它不应该有jpg编码器吗?事实上,它确实工作得很好。只是IrfanView看起来有点混乱。带单参数的Save方法忽略了扩展名,并在一些初步的MS文档中保存为默认格式。据说它正在查看扩展名,但后来它作为错误被删除。它对你有用,但实际上你有一个扩展名为jpg的PNG图像。如果在文本查看器中打开它,很可能会找到PNG头。但是它不应该有jpg编码器吗?事实上,它确实工作得很好。只是IrfanView看起来有点混乱。带单参数的Save方法忽略了扩展名,并在一些初步的MS文档中保存为默认格式。据说它正在查看扩展名,但后来它作为错误被删除。它对你有用,但实际上你有一个扩展名为jpg的PNG图像。如果在文本查看器中打开它,很可能会找到PNG标题。