1

私のユーティリティは、.jpg または .png ファイルのサイズを変更することになっています。

1 つの場所 (IrfanView がインストールされていない職場) では問題なく動作するようです。しかし、自宅で *.jpg を開いて保存 (サイズ変更) すると、次のように表示されます。

ここに画像の説明を入力

ただし、どちらの場合でも(ダイアログで「はい」または「いいえ」を選択しても、画像は正常に表示されます。

IOW、私はjpgとpngの両方を読み込んで保存することができ、それらはそのまま保存され、正常に表示されます。しかし、IrfanView は、それらが台無しになっていると主張しています。

実際、画像がどのように保存されているかはわかりません。拡張子に基づいて「舞台裏で」適切な形式で保存しただけだと思っていました。とにかく、これはかなり単純なユーティリティなので、すべてのコードを示します。

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;
            }
        }

    }
}

..そしてGUI(「画像のサイズ変更」ボタンを押す直前:

ここに画像の説明を入力

アップデート

Eugene Sh.'ls のコメントに基づいて、Save メソッドを次のブロックに変更しました。

bool success = true;
. . .
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
{
    success = false;
}

if (success)
{
    MessageBox.Show(String.Format("Done! File saved as {0}", newFilename));
}
else
{
    MessageBox.Show("Something went awry. The file was not saved");
}

更新 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;
            }
        }

    }
}
4

3 に答える 3

1

コンソールに移動して、ファイルを印刷します。PNG ファイルの場合は、PNG が表示されて停止します。

JPEG の場合、大量のゴミが表示されますが、上部に EXIF または JFIF が表示されるはずです。はじまりはFF D8

JPEG と PNG は署名が異なるため、アプリケーションはそれらを内容から区別し、適切なデコーダーを招待することができます。

画像アプリケーションは通常、拡張子ではなく、ストリームの内容から画像の種類を識別します。

于 2015-03-19T15:09:26.173 に答える