第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何使用 Winforms C# 或 C++ .Net 在不更改文件中的任何其他內(nèi)容的情況下修改

如何使用 Winforms C# 或 C++ .Net 在不更改文件中的任何其他內(nèi)容的情況下修改

C#
溫溫醬 2021-11-07 20:14:20
我正在編寫一個(gè)程序來幫助我整理多年來拍攝的數(shù)以千計(jì)的數(shù)碼照片。我想要的一個(gè)功能是能夠通過修改 Orientation EXIF 標(biāo)簽來旋轉(zhuǎn)圖像,而無需更改文件中的任何其他內(nèi)容。我知道這是可能的,因?yàn)槿绻?Windows 資源管理器中右鍵單擊文件并選擇向左/向右旋轉(zhuǎn),那么就會發(fā)生這種情況 - 修改一個(gè)字節(jié)以匹配新的方向值。我特別不想修改圖片本身。然而,我嘗試過的一切要么沒有效果,要么顯著改變了文件(例如,將文件減少了 14k 字節(jié),大概是通過重新編碼)。我在幾個(gè)網(wǎng)站上閱讀了很多帖子,似乎沒有人對我的具體問題有答案——他們大多談?wù)撎砑宇~外標(biāo)簽,以及添加填充的需要,但如果我只是需要添加填充,我肯定不需要添加填充試圖修改一個(gè)現(xiàn)有字節(jié)(尤其是我知道 Windows 資源管理器可以做到)。我正在使用在 Windows 10 專業(yè)版下運(yùn)行 Framework 4.5.2 的 C# Windows 窗體應(yīng)用程序。還嘗試從 C++ 中做到這一點(diǎn)。感謝所有貢獻(xiàn)者,他們的例子是我建立的。以下是 5 個(gè)基本的控制臺應(yīng)用程序示例:使用 System.Drawing.Image 類的基本 C#。這將 Orientation 標(biāo)簽設(shè)置為 OK,但會減小尺寸,即重新編碼圖片。 static void Main(string[] args) {     const int EXIF_ORIENTATION = 0x0112;     try     {         using (Image image = Image.FromFile("Test.jpg"))         {             System.Drawing.Imaging.PropertyItem orientation = image.GetPropertyItem(EXIF_ORIENTATION);             byte o = 6; // Rotate 90 degrees clockwise             orientation.Value[0] = o;             image.SetPropertyItem(orientation);             image.Save("Test2.jpg");         }     }     catch (Exception ex)     {     }InPlaceBitMapEditor 類看起來正是我所需要的,調(diào)試行表明這是修改 EXIF 標(biāo)記,但文件未修改,即更改未寫出。 static void Main(string[] args) {     try     {         Stream stream = new System.IO.FileStream("Test.JPG", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);         JpegBitmapDecoder pngDecoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);         BitmapFrame frame = pngDecoder.Frames[0];         InPlaceBitmapMetadataWriter inplace = frame.CreateInPlaceBitmapMetadataWriter();         ushort u = 6; // Rotate 90 degrees clockwise         object i1 = inplace.GetQuery("/app1/ifd/{ushort=274}"); // DEBUG - this is what it was before - 1         if (inplace.TrySave() == true)         {             inplace.SetQuery("/app1/ifd/{ushort=274}", u);         }         object i2 = inplace.GetQuery("/app1/ifd/{ushort=274}"); // DEBUG - this is what it is after - 6         stream.Close();     }     catch (Exception ex)     {     }
查看完整描述

2 回答

?
眼眸繁星

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊

除非jpeg的寬度和高度都是16的倍數(shù),否則無法這樣做。如果在GDI+中進(jìn)行此操作,并且寬度和高度不是16的倍數(shù),GDI+將盡最大努力保持壓縮質(zhì)量相同。在.net中也是一樣

請注意,您的 GDI+ 代碼只會旋轉(zhuǎn)縮略圖。要旋轉(zhuǎn)圖像,請使用以下代碼:


void RotateImage()

{

    //new/delete operator is not necessary, unless 

    //Gdiplus startup/shutdown is in the same scope

    Gdiplus::Image image(L"source.jpg");

    if((image.GetWidth() % 16) != 0 || (image.GetHeight() % 16) != 0)

        wprintf(L"Lossless compression is not possible\n");


    Gdiplus::EncoderParameters encoder_params;

    encoder_params.Count = 1;

    encoder_params.Parameter[0].Guid = Gdiplus::EncoderTransformation;

    encoder_params.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong;

    encoder_params.Parameter[0].NumberOfValues = 1;


    //rotate

    ULONG transformation = Gdiplus::EncoderValueTransformRotate90;

    encoder_params.Parameter[0].Value = &transformation;


    CLSID clsid;

    GetEncoderClsid(L"image/jpeg", &clsid);

    auto stat = image.Save(L"destination.jpg", &clsid, &encoder_params);


    wprintf(L"Save %s\n", (stat == Gdiplus::Ok) ? L"succeeded" : L"failed");

}


int main()

{

    Gdiplus::GdiplusStartupInput gdiplusStartupInput;

    ULONG_PTR gdiplusToken;

    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    RotateImage();

    Gdiplus::GdiplusShutdown(gdiplusToken);

    return 0;

}


查看完整回答
反對 回復(fù) 2021-11-07
?
一只甜甜圈

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊

以編程方式執(zhí)行此操作的方法是讀取 SOS 市場之后應(yīng)出現(xiàn)的 APP1 標(biāo)記。獲取標(biāo)記結(jié)構(gòu)的 JPEG 文檔。

擁有 APP1 標(biāo)記后,您需要根據(jù)需要更改方向。

然后將 SOS 標(biāo)記、修改后的 APP1 標(biāo)記以及 APP1 標(biāo)記之后的其余 JPEG 流寫入新文件。

這就是他們的全部。唯一的復(fù)雜性是導(dǎo)航 EXIF 文檔以進(jìn)行方向設(shè)置。


查看完整回答
反對 回復(fù) 2021-11-07
  • 2 回答
  • 0 關(guān)注
  • 236 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號