[C#] уменьшить размер картинки

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Sharper, 26 Mar 2011.

  1. Sharper

    Sharper New Member

    Joined:
    10 Mar 2010
    Messages:
    30
    Likes Received:
    1
    Reputations:
    0
    Есть картинка, например размер 137740 байт. Мне нужно ее уменьшить (сжать).

    Делал через Compress:
    PHP:
    public byte[] Compress(byte[] raw)
            {
                
    using (MemoryStream memory = new MemoryStream())
                {
                    
    using (GZipStream gzip = new GZipStream(memoryCompressionMode.Compresstrue))
                    {
                        
    gzip.Write(raw0raw.Length);
                    }
                    return 
    memory.ToArray();
                }
            }
    Объем только увеличился. Я на него и не расщитывал если чесно он может сжать только если будет в массиве много повторяющихся байтов.

    Делал через ColorMatrix:

    imag– моя картинка

    PHP:
    Graphics g Graphics.FromImage(imag);
                
    ColorMatrix colorMatrix = new ColorMatrix(
          new 
    float[][] 
          {
                                      new 
    float[] {.3f.3f.3f00},
                        new 
    float[] {.59f.59f.59f00},
                           new 
    float[] {.11f.11f.11f00},
                          new 
    float[] {00010},
                          new 
    float[] {00001}
          });

                
    ImageAttributes attributes = new ImageAttributes();
                
    attributes.SetColorMatrix(colorMatrix);
                
    g.DrawImage(imag, new Rectangle(00imag.Widthimag.Height), 00imag.Widthimag.HeightGraphicsUnit.Pixelattributes);
                
    g.Dispose();
                return 
    imag;

    Способ скинул 20кб но мы получаем не цветную картинку ! Где справедливость?



    Хочу выслушать ваши мысли.


    P.S картинка должна после сжатия должна такая же бить как и до.
     
  2. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    пережимать jpeg/jpg/png смысла нет, они и так ужаты по самые уши, но вот если bmp, то конвертируй ее в ранесказанные форматы
     
  3. Sharper

    Sharper New Member

    Joined:
    10 Mar 2010
    Messages:
    30
    Likes Received:
    1
    Reputations:
    0
    Сори, забыл сказать, что картинка png.

    Ну, вот если я возьму winrar максимально сожму, то там неплохо сожмется вот мне что-то такое и надо. :rolleyes:
     
  4. eclipse

    eclipse Member

    Joined:
    19 Dec 2010
    Messages:
    155
    Likes Received:
    74
    Reputations:
    85
    Code:
    Public Class Form1
        Dim filnam As String
        Dim k As Integer
        Dim flag As Boolean
        Dim bmp_to As Bitmap
        Dim x, y As Integer
        Dim watermarkImage As Bitmap
        Dim basicImage As Bitmap
    
        Private Sub resizer(ByVal source As String, ByVal k As Integer)
            Dim img As New Bitmap(source)
            Dim wid, hgt As Integer
    1:
            wid = Math.Abs(img.Width \ k)
            hgt = Math.Abs(img.Height \ k)
    
            bmp_to = New Bitmap(wid, hgt)
    
            ' Копируем картинку с уменьшенными размерами без изменений
            Dim g As Graphics = Graphics.FromImage(bmp_to)
            g.InterpolationMode = _
              Drawing2D.InterpolationMode.HighQualityBilinear
            g.DrawImage(img, 0, 0, wid - 1, hgt - 1)
            ' Выводим результат
            ProgressBar1.Maximum = 1
            ProgressBar1.Value = CInt(0.5)
            bmp_to.Save(source.ToString + "-wp.".ToString + Microsoft.VisualBasic.Right(source, 3).ToString)
            Try
                If CInt(My.Computer.FileSystem.GetFileInfo(source + "-wp." + Microsoft.VisualBasic.Right(source, 3)).Length) > CInt(MaskedTextBox2.Text) Then
                    k += 1
                    GoTo 1
                End If
                ProgressBar1.Value = 1
                'antialiasing   
            Catch ex As Exception
    
            End Try
    
        End Sub
    
        Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
            Process.Start("explorer.exe")
        End Sub
    
        Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
            Dim str As String = "ERR"
            Dim n As Integer
            Try
                ' Размеры для новой картинки
                If MaskedTextBox2.Text <> "" And MaskedTextBox2.Text <> Nothing Then
                    For Each lstr As String In ListBox1.Items
                        n += 1
                        resizer(lstr, 2)
                        Label1.Text = CStr(n.ToString + "/" + ListBox1.Items.Count.ToString)
                        lstr = ""
                        Label1.Refresh()
                    Next
                End If
                str = "THX!"
            Catch ex As Exception
            End Try
            ProgressBar1.Value = 0
            If str = "ERR!" Then
                MsgBox(str, MsgBoxStyle.Critical)
            Else
                MsgBox(str, MsgBoxStyle.Information)
            End If
            ListBox1.Items.Clear()
            Label1.Text = ""
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            flag = False
        End Sub
    
    
    
    End Class
    

    Перепиши под C#, эта прога была написана именно для уменьшения размера фоток и работает уменьшая фото до заданного размера
     
  5. Sharper

    Sharper New Member

    Joined:
    10 Mar 2010
    Messages:
    30
    Likes Received:
    1
    Reputations:
    0

    не не размер пикселей я и сам могу изменить. Мне нужно сжать размер самой картинки !
     
  6. eclipse

    eclipse Member

    Joined:
    19 Dec 2010
    Messages:
    155
    Likes Received:
    74
    Reputations:
    85
    Тогда тебе надо делать харакири, ибо как сказал выше визард, jpg,png,gif форматы и так настолько сжаты - насколько их смогли сжать, дальше - некуда, повторное использование все тех же алгоритмов сжатия может привести к побочному эффекту который ты по-ходу уже успел пронаблюдать (увеличение размера) :)